【金三银四】Mysgl优化了解?什么情况下会导致SQL索引失效?如何写出高效SQL与优化慢SQL

Mysgl优化

MySQL 优化是指对 MySQL 数据库的配置、表设计、查询语句等进行针对性的优化,以提高数据库的性能和效率。这包括但不限于合理设计数据库表结构、编写高效的 SQL 查询语句、创建合适的索引以及调整数据库服务器的参数等。

当MySQL单表记录数过大时,性能下降是一个常见问题。这是因为随着数据量的增加,数据库在执行增删改查操作时需要处理更多的数据。

当涉及到 MySQL 数据库优化时,可以从以下几个方面进行详细讨论:

一、单表优化:

  1. 字段优化

    • 选择合适的数据类型以减少存储空间和提高查询效率。
    • 使用 TINYINT、SMALLINT、MEDIUM_INT 代替 INT,非负数加 UNSIGNED。
    • VARCHAR 长度根据实际需要分配。
    • 首选 TIMESTAMP 而非 DATETIME。
    • 单表字段不超过 20 个。
    • 尽量使用NOT NULL约束,避免NULL带来的额外开销。
    • 枚举(ENUM)或整数(INT)比字符串(VARCHAR)更高效,特别是有大量重复值时。
    • 使用整数存储IP地址以提高查询效率。
  2. 索引优化

    • 根据查询模式创建索引,重点关注WHERE和ORDER BY中的列,可根据EXPLAIN命令来查看是否用了索引还是全表扫描。
    • 避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
    • 稀少值的字段不适合建索引,如性别。
    • 避免使用外键和 UNIQUE 约束。
    • 对字符字段可以考虑创建前缀索引以减少索引大小。
    • 避免对索引列进行运算,以免引起索引失效。
  3. 查询SQL优化

    • 开启慢查询日志以定位性能瓶颈。
    • 避免列运算,尽量简化 SQL。
    • 不使用 SELECT *。
    • 将 OR 改写成 IN。
    • 避免函数和触发器,推迟至应用程序层实现。
    • 少用 JOIN,使用同类型比较。
    • 使用索引避免全表扫描,提高查询效率。
    • 使用LIMIT进行分页查询,避免一次性获取大量数据。
    • 尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  4. 存储引擎选择

    • MyISAM适用于读多写少的场景,提供全文索引和压缩表功能。
    • InnoDB适用于写多读少的场景,支持事务、行锁和外键,提供更高的并发处理能力和数据保护。
      当然可以,以下是一个简单的表格,列出了MyISAM和InnoDB存储引擎的特点:
特点 MyISAM InnoDB
读写特性 读多写少 写多读少
事务支持 不支持 支持
锁定方式 表级锁定 行级锁定
外键支持 不支持 支持
全文索引 支持 不支持
压缩表 支持 不支持
并发处理 较差 较好
数据保护 不提供数据保护机制 提供数据保护机制

总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表。
希望这个表格能够清晰地展示出MyISAM和InnoDB存储引擎的特点。

  1. 系统调优参数

sysbench:一个模块化,跨平台以及多线程的性能测试工具。

https://github.com/akopytov/sysbench

iibench-mysql:基于Java的MySQL / Percona / MariaDB 索引进行插入性能测试工具。

https://github.com/tmcallaghan/iibench-mysql

tpcc-mysql:Percona开发的TPC-C测试工具。

https://github.com/Percona-Lab/tpcc-mysql
在优化数据库时,建议定期监控性能并评估优化效果。在进行大规模优化前,应在测试环境中验证,确保安全有效。

二、读写分离:

通过将读操作和写操作分开到不

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值