2023-11-21 03:32:35
EXPLAIN是MySQL中用于分析SQL查询执行计划的重要工具,通过展示查询如何访问数据、使用索引及连接方式等信息,帮助开发者定位性能瓶颈。
核心用法基本语法在查询前添加EXPLAIN关键字,支持扩展选项和格式化输出:
EXPLAIN [EXTENDED] [FORMAT=JSON] SELECT * FROM table WHERE condition;EXTENDED:显示额外信息(如过滤条件)。
FORMAT=JSON:以JSON格式输出,便于程序解析。
示例命令
EXPLAIN SELECT * FROM users WHERE name = 'John';EXPLAIN的输出包含以下关键列,每列均反映查询执行的某个方面:
id
查询中表的执行顺序标识。若为NULL,表示结果集(如UNION操作)。
select_type
查询类型,例如:
SIMPLE:简单查询(无子查询或UNION)。
SUBQUERY:子查询。
UNION:UNION中的第二个或后续查询。
table
当前行访问的表名或别名。
type(重点优化指标)
连接类型,效率从高到低排序:
system > const > eq_ref > ref > range > index > ALL。
需警惕ALL(全表扫描),通常需优化。
possible_keys
可能使用的索引列表。若为空,表示无适用索引。
key
实际使用的索引。若与possible_keys不符,可能需强制索引或优化查询。
key_len
索引使用的字节数,反映索引字段的使用长度。
rows(关键性能指标)
预估需要检查的行数。数值越大,潜在性能问题越高。
filtered
存储引擎返回数据在服务层过滤的百分比(如10.00表示仅10%数据符合条件)。
Extra
额外信息,常见值:
Using index:覆盖索引(无需回表)。
Using where:服务层过滤数据。
Using temporary:使用临时表(通常需优化)。
Using filesort:需额外排序(可能缺索引)。
识别全表扫描若type=ALL且rows值大,考虑添加索引或重写查询。
检查索引使用
确认key字段是否使用了预期索引。
若possible_keys有值但key为NULL,可能索引选择性不足或统计信息过时(可尝试ANALYZE TABLE)。
避免临时表和文件排序
出现Using temporary或Using filesort时,检查是否缺少复合索引(如ORDER BY和WHERE条件字段未同时索引)。
覆盖索引优化
若Extra显示Using index,说明查询仅通过索引获取数据,无需回表,效率高。
可能输出:
+----+-------------+-------+--------+---------------+---------+---------+-----------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------+--------+---------------+---------+---------+-----------+------+-------------+| 1 | SIMPLE | u | range | PRIMARY,age | age | 4 | NULL | 100 | Using where || 1 | SIMPLE | o | ref | user_id | user_id | 4 | test.u.id | 5 | NULL |+----+-------------+-------+--------+---------------+---------+---------+-----------+------+-------------+users表使用age索引范围扫描(type=range),避免全表扫描。
orders表通过user_id索引连接(type=ref),效率较高。
若rows值过大,需检查索引选择性或数据分布。