1.有关EXPLAIN
EXPLAIN
是MySQL中用于分析查询执行计划的工具,它返回的结果包含多个属性(字段),每个属性都提供了关于查询执行的重要信息。
2.有关EXPLAIN返回结果中的属性和值
以下是EXPLAIN
返回的所有属性及其可能的属性值,以及每个属性的详细说明:
1. id
- 说明: 查询的标识符。是一个整数,表示查询中每个
SELECT
子句或操作的顺序。如果id
相同,则表示这些操作是在同一层次上并行执行的;id
值越大,执行优先级越高。
2. select_type
- 说明: 查询的类型。
- 可能值:
- SIMPLE: 简单查询(不包含子查询或UNION)。
- PRIMARY: 主查询(最外层的查询)。
- SUBQUERY: 子查询。
- DERIVED: 派生表(FROM子句中的子查询)。
- UNION: UNION查询的第二个或后续查询。
- UNION RESULT: UNION查询的结果。
3. table
- 说明: 查询涉及的表名。如果是子查询或派生表,可能会显示为临时表名。
4. partitions
显示查询可能使用到的分区信息,如果表没有分区,则该列值为 NULL
。
5. type
- 说明: 访问类型,表示MySQL如何查找数据。
- 可能值(从最优到最差):
- system: 表只有一行(系统表)。
- const: 通过主键或唯一索引查找,结果只有一行。
- eq_ref: 使用唯一索引进行关联查询(如JOIN)。
- ref: 使用非唯一索引查找,返回匹配某个单独值的所有行。
- range: 使用索引进行范围查找(如
BETWEEN
、>
、<
)。 - index: 全索引扫描(扫描整个索引树)。
- ALL: 全表扫描(未使用索引)。
6. possible_keys
- 说明: 可能使用的索引。但不一定会被实际使用,如果为
NULL
,表示没有可用的索引。
7. key
- 说明: 实际使用的索引。如果为
NULL
,表示未使用索引。
8. key_len
- 说明: 使用的索引的长度(字节数)。单位是字节,该值越短,表示索引使用越高效。
9. ref
- 说明: 与索引比较的列或常量。
10. rows
- 说明: 预估需要扫描的行数。行数越少,查询效率越高。该值只是一个估计值,并不一定准确,但可以作为查询性能的一个参考。
11. filtered
- 说明: 过滤后的行数百分比(MySQL 5.7+)。值越大表示过滤效果越好。
12. Extra
- 说明: 额外信息,提供查询执行的详细信息。
- 可能值:
- Using where: 使用了
WHERE
条件过滤数据。 - Using index: 使用了覆盖索引(不需要回表查询数据行)。
- Using temporary: 使用了临时表。通常会影响查询性能。
- Using filesort: 使用了文件排序(可能需要优化)。
- Using join buffer: 使用了连接缓冲区。
- Distinct: 查找唯一值。
- Impossible WHERE:
WHERE
条件永远为假(如1=2
)。
- Using where: 使用了
3.总结
EXPLAIN
返回的属性及其值提供了查询执行计划的详细信息。通过分析这些属性,可以判断:
是否使用了索引?使用了哪些索引?查询的执行效率如何?是否需要优化查询或索引。
根据查询执行计划的详细信息可以操作:
- 性能优化:通过分析执行计划,可以找出查询中可能存在的性能瓶颈,例如全表扫描、文件排序、使用临时表等问题,并针对性地进行优化,如添加合适的索引、调整查询语句结构等。
- 索引评估:可以查看查询是否使用了索引以及使用了哪些索引,帮助评估索引的有效性,判断是否需要创建、修改或删除索引。
- 查询理解:帮助开发者和 DBA 深入理解查询的执行过程,包括表的连接顺序、数据的读取方式等,从而更好地设计和优化数据库查询。