MySQL性能优化是数据库运维和开发过程中非常重要的工作,合理的优化可以大幅提升系统的响应速度,降低服务器资源消耗。下面为大家详细介绍21条实用的MySQL性能优化技巧。

一、索引相关优化技巧
1. 合理创建索引
为经常作为查询条件、连接条件、排序条件的字段创建索引,避免全表扫描。但不要过度创建索引,因为索引会占用存储空间,还会降低写入、更新、删除操作的效率。
2. 使用覆盖索引
查询的字段尽量包含在索引中,这样查询时不需要回表查询数据行,直接通过索引就能获取所需数据,减少IO消耗。
3. 避免索引失效场景
不要在索引字段上使用函数、进行运算,不要使用LIKE '%关键词%'这种左模糊匹配,否则会导致索引失效,触发全表扫描。
4. 联合索引遵循最左前缀原则
创建联合索引时,查询条件要包含联合索引的最左字段,才能命中索引。比如联合索引是(a,b,c),查询条件包含a、a和b、a和b和c都可以命中索引,只包含b或c则无法命中。
5. 定期清理无用索引
通过sys.schema_unused_indexes视图可以查看长期未使用的索引,及时删除这些无用索引,减少索引维护成本。
二、查询语句优化技巧
6. 避免使用SELECT *
只查询需要的字段,减少数据传输量,也能更好地利用覆盖索引,避免不必要的回表操作。
7. 优化分页查询
大偏移量的分页查询性能很差,可以通过子查询先获取主键,再关联查询完整数据。比如原查询是:
-- 原低效分页查询 SELECT * FROM user ORDER BY id LIMIT 100000, 10;
优化后的查询:
-- 优化后分页查询 SELECT * FROM user u JOIN (SELECT id FROM user ORDER BY id LIMIT 100000, 10) tmp ON u.id = tmp.id;
8. 减少子查询,尽量使用连接查询
子查询可能会创建临时表,增加性能开销,适当使用JOIN连接查询可以提升查询效率,同时注意连接字段要加索引。
9. 避免使用OR连接条件
如果OR连接的多个条件中有一个字段没有索引,整个查询就不会使用索引,可以改用UNION拆分查询,让每个子查询都能命中索引。
10. 合理使用EXPLAIN分析查询
每次优化查询语句前,先使用EXPLAIN查看查询执行计划,重点关注type、key、rows、Extra字段,判断索引是否命中,扫描行数是否合理。
-- 使用EXPLAIN分析查询 EXPLAIN SELECT id, name FROM user WHERE age > 18;
三、表结构优化技巧
11. 选择合适的数据类型
优先使用更小的数据类型,比如能用TINYINT就不用INT,能用VARCHAR就不用TEXT,减少存储空间占用,提升查询效率。
12. 避免使用NULL字段
NULL字段会让索引、统计和值的比较变得更复杂,尽量给字段设置默认值,使用NOT NULL约束。
13. 适当拆分大表
如果单表数据量过大,比如超过千万级,可以考虑垂直拆分(把不常用字段拆分到扩展表)或者水平拆分(按时间、用户ID等维度拆分到多个表)。
14. 使用自增主键
自增主键可以让数据按顺序写入,减少页分裂,提升插入效率,同时索引结构也更紧凑,查询效率更高。
15. 控制单表字段数量
单表字段不要过多,尽量保持在30个以内,过多的字段会导致行数据过大,增加IO消耗,也不利于维护。
四、配置与运维优化技巧
16. 调整InnoDB缓冲池大小
InnoDB缓冲池用于缓存数据和索引,建议设置为服务器可用内存的60%-80%,减少磁盘IO。可以通过修改配置文件调整:
-- MySQL配置文件my.cnf中调整缓冲池大小 [mysqld] innodb_buffer_pool_size = 4G
17. 开启查询缓存(按需使用)
对于查询频繁且数据更新少的场景,可以开启查询缓存,注意查询缓存不适合更新频繁的表,否则缓存频繁失效反而降低性能。MySQL 8.0已经移除了查询缓存功能,低版本可按需开启。
18. 定期优化表
对于频繁更新的表,会产生碎片,定期执行OPTIMIZE TABLE可以整理表碎片,回收存储空间,提升查询效率。
-- 优化表碎片 OPTIMIZE TABLE user;
19. 合理设置连接数
根据业务并发量调整max_connections参数,避免连接数不足导致业务报错,也不要设置过大导致服务器资源耗尽。
20. 分离读写请求
对于读多写少的业务,可以搭建MySQL主从复制架构,主库负责写入,从库负责读取,分散数据库压力,提升整体性能。
21. 监控慢查询日志
开启慢查询日志,定期分析慢查询语句,针对性优化性能差的查询,从根源上解决性能问题。可以在配置文件中开启慢查询:
-- 开启慢查询日志配置 [mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1
以上21条MySQL性能优化技巧覆盖了不同层面的优化方向,实际优化时需要根据具体的业务场景和性能瓶颈选择对应的方案,不要盲目套用,同时优化后要做好测试,确保优化效果符合预期。