MySQL通过EXPLAIN SELECT语句来展示查询计划,其中每行数据代表一个操作步骤,MySQL的优化器首先评估各种查询计划,然后选择一种执行效率最高的计划,该计划便是大家看到的执行计划。
EXPLAIN SELECT id, name, age FROM user WHERE age >20;
执行计划结果分为多个部分:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra。
id
查询中的每一步骤都有一个唯一标识符,id列显示标识符,查询的第一步id为1,一次类推。
select_type
select_type列指示MySQL优化器在SELECT查询中选择了哪种处理方式。常见的取值有SIMPLE、PRIMARY、UNION、UNION RESULT、SUBQUERY、DEPENDENT SUBQUERY等。
table
table列显示MySQL将如何访问表。当查询为单表查询时,此列的值为实际的表名。当查询涉及多个表时,此列的值为MySQL内部使用的临时表名。
partitions
该列值显示的是匹配哪个分区。如果表没有分区,该列值总是NULL。
type
type列指示MySQL优化器在表中找到所需行的方式,它是查询性能关键的指标之一。常见取值有:
- system
- const
- eq_ref
- ref
- range
- index
- ALL
possible_keys
该列显示查询可能使用索引的列表。通常这些索引与WHERE条件中使用的列有关。
key
该列显示MySQL将使用的索引。如果没有使用索引,该列将显示NULL。
key_len
该列显示MySQL选择使用的索引字段的长度。越短的索引说明性能越好。
ref
该列显示MySQL将使用的索引连接条件,比如使用哪个列或常量与索引键进行比较。
rows
该列显示MySQL预计将检查多少行。
filtered
该列显示查询结果中有多少行符合WHERE条件,即过滤掉不需要的数据行数量。
Extra
Extra列显示关于MySQL执行查询操作的额外信息,可以告诉大家更多的执行信息。
掌握执行计划的基本信息能够帮助大家检测并优化慢查询,提高查询速度。