结论:MySQL查询优化的核心是使用索引、避免SELECT *、优化JOIN查询、定期分析EXPLAIN结果,并调整表结构。立即应用这些技巧:为WHERE子句列添加索引;用LIMIT限制结果集;避免在索引列上使用函数。
技巧一:索引优化
索引是MySQL查询优化的基石。合理创建索引,能显著提升查询速度。针对经常出现在WHERE、JOIN、ORDER BY和GROUP BY中的列,建立索引。复合索引适用于多列组合查询,但注意索引顺序,左前缀原则很重要。
技巧二:避免SELECT *
查询时只选择需要的列,不要用SELECT *。这样减少数据传输量,提高效率,尤其在大数据量表中。明确列出字段,能让优化器更好地选择执行计划。
技巧三:EXPLAIN分析查询计划
使用EXPLAIN查看查询执行计划,关注type、key、rows等字段。type从ALL到index、ref、eq_ref逐步优化为好。rows越小越好,key显示使用了哪个索引,帮助诊断问题。
技巧四:优化JOIN查询
JOIN时,确保驱动表(小表)在前,被驱动表(大表)有索引。避免笛卡尔积,使用INNER JOIN代替LEFT JOIN当可能。子查询有时比JOIN慢,可改写为JOIN。
技巧五:分页优化
大偏移分页用id>last_id + LIMIT代替OFFSET。传统OFFSET n会扫描前n行,效率低。新方法直接从指定位置开始,速度飞快。
技巧六:表结构调整
选择合适数据类型,如INT代替VARCHAR存储数字。使用TIMESTAMP代替DATETIME节省空间。拆分大字段到单独表,避免NULL值过多,用合适默认值。
FAQ
Q: 如何快速检查查询是否用了索引?
A: 用EXPLAIN SELECT ...,看key列是否有值。
Q: 为什么我的索引没生效?
A: 可能是类型不匹配、用了函数、LIKE '%xx%'或数据分布导致优化器放弃。
Q: 优化后查询还是慢怎么办?
A: 检查服务器配置如innodb_buffer_pool_size、查询缓存,并考虑读写分离。
Q: 什么时候建覆盖索引?
A: 当SELECT列都在索引中时,覆盖索引避免回表,性能最佳。