2022-11-04 07:02:13
MySQL执行计划是优化器在执行SQL语句前生成的访问和处理数据策略,通过EXPLAIN命令查看,可分析查询性能并优化索引与查询结构。 以下是具体解析:
查看执行计划的方法使用EXPLAIN关键字置于SELECT、UPDATE、DELETE等语句前,例如:
EXPLAIN SELECT * FROM users WHERE age > 30;执行后会返回结果集,包含多个字段,每个字段提供查询执行方式的信息。
执行计划关键字段解析
id:查询中每个SELECT的标识符。相同id表示属于同一查询块;id越大越先执行。
select_type:查询类型,如SIMPLE(简单查询)、PRIMARY、SUBQUERY、DERIVED等。
table:当前行操作涉及的表名。
partitions:匹配的分区(若使用分区表)。
type:连接类型,反映访问方式,常见值从优到劣:system → const → eq_ref → ref → range → index → ALL其中ALL表示全表扫描,性能最差。
possible_keys:可能使用的索引列表。
key:实际使用的索引。
key_len:所用索引的长度,可判断是否使用了索引的全部部分。
ref:显示哪些列或常量被用于与索引比较。
rows:MySQL估计需要扫描的行数,数值越小越好。
filtered:存储引擎返回的数据中,经WHERE条件过滤后剩余的百分比(基于统计信息估算)。
Extra:额外信息,非常重要,常见值包括:
Using where:使用WHERE条件过滤数据。
Using index:使用覆盖索引,无需回表。
Using index condition:使用索引条件下推(ICP)。
Using filesort:需要额外排序操作,应尽量避免。
Using temporary:需要创建临时表,通常出现在GROUP BY或DISTINCT操作中,性能较差。
通过执行计划优化查询的方法
检查type字段:若为ALL或index,表示全表扫描或遍历索引,性能较差。考虑添加合适的索引,提升为range或ref级别。
观察key字段:若key为空,而possible_keys有值,说明未使用索引。需分析原因,如类型不匹配、函数操作导致索引失效。
关注rows数量:若扫描行数过多,说明查询效率低。可通过优化索引或查询条件减少扫描行数。
处理Extra中的问题:
出现Using filesort时,优化ORDER BY语句,确保使用索引排序。
出现Using temporary时,优化GROUP BY或DISTINCT操作,减少临时表创建。
利用覆盖索引:通过Using index实现覆盖索引,避免回表查询,提高速度。例如,查询字段全部包含在索引中时,可直接从索引获取数据。
实际例子分析执行以下查询:
EXPLAIN SELECT name FROM users WHERE city = 'Beijing' ORDER BY age;假设输出中:
type=ref
key=idx_city
Extra=Using where; Using filesort说明虽然使用了city字段的索引,但排序仍需额外操作。若想消除filesort,可建立联合索引(city, age),使查询既能过滤又能有序。
掌握EXPLAIN的使用方法和各字段含义,能有效帮助分析MySQL的查询策略,从而写出更高效的SQL。