文档为MySQL性能优化技术指南,核心内容包含Explain工具详解及索引最佳实践,适用于SQL查询分析与索引优化场景。
一、 EXPLAIN工具详解
-
-
通过
EXPLAIN关键字模拟优化器执行SQL,返回执行计划而非实际查询结果。 -
变种命令:
EXPLAIN EXTENDED:显示优化信息,配合SHOW WARNINGS查看优化后语句。EXPLAIN PARTITIONS:显示分区表访问信息。
-
-
关键输出列解析
-
id列:SQL执行顺序,值越大优先级越高。
-
select_type列:查询类型(如
SIMPLE、PRIMARY、SUBQUERY)。 -
type列(性能关键指标):
- 性能等级:
system > const > eq_ref > ref > range > index > ALL。 - 需保证查询至少达到
range级别,推荐优化至ref。
- 性能等级:
-
key_len列:索引使用的字节数,推算实际生效的索引字段。
-
Extra列(重点分析项):
Using index:覆盖索引优化。Using temporary:需创建临时表,建议用索引优化。Using filesort:外部排序,可能需索引优化。
-
二、索引最佳实践
-
核心原则
- 全值匹配: 尽量为查询条件提供完整索引字段。
- 最左前缀法则:查询需从索引最左列开始且不跳过中间列。
- 禁止索引列计算:避免对索引列使用函数或类型转换。
-
优化策略
-
覆盖索引:仅通过索引获取数据,减少
SELECT *。 -
范围查询限制:范围条件右侧的索引列失效,需合理设计索引顺序。
-
LIKE语句:通配符开头(如
%abc)导致索引失效,建议改用abc%或覆盖索引。 -
避免索引失效场景:
- 使用
!=、NOT IN、IS NULL等操作。 - 字符串未加单引号导致隐式类型转换。
- 使用
-
-
特殊场景处理
- OR/IN查询:优化器可能放弃索引,建议拆分为多次查询或结合业务优化。
- 范围查询拆分:大数据量范围查询可分段执行,提升索引命中率。
三、关键结论
- Explain工具需重点关注
type列性能等级及Extra列提示,优先优化至ref级别以上。 - 索引设计需遵循最左前缀法则,避免计算与隐式转换,优先使用覆盖索引。
- LIKE语句、范围查询、
OR/IN条件为常见索引失效场景,需针对性优化。