查询优化 Explain
一、概述
一条查询语句在经过 MySQL 查询优化器的基于成本和规则的优化后,生成一个执行计划。执行计划展示了具体执行查询的方式,包括多表连接的顺序、每个表的访问方法等。
二、查看执行计划
若要查看某个查询的执行计划,可以在查询语句前加上 EXPLAIN。
EXPLAIN SELECT * FROM your_table WHERE your_condition;
三、执行计划详解
执行计划的各列解释:
-
id: 分配给查询语句中每个 SELECT 关键字的唯一标识。
-
select_type: 描述每个 SELECT 关键字的属性。
- SIMPLE: 不包含 UNION 或子查询的查询。
- PRIMARY: 对于包含 UNION、UNION ALL 或子查询的大查询,最左边查询的 select_type 是 PRIMARY。
- UNION: 大查询中除最左边的查询外的其他查询。
- UNION RESULT: 用于执行 UNION 查询的临时表。
- SUBQUERY: 包含不相关子查询,使用物化方案执行。
- DEPENDENT SUBQUERY: 包含相关子查询,可能会被执行多次。
- DEPENDENT UNION: 大查询中依赖外层查询的 UNION 查询。
- DERIVED: 执行包含派生表的查询,对应物化的子查询。
- MATERIALIZED: 子查询被物化并与外层查询连接。
-
table: 表示表名。
-
type: 表示访问方法。
-
possible_keys 和 key: 列出可能使用的索引和实际使用的索引。
-
key_len: 表示使用索引的记录的最大长度。
-
ref: 在执行查询时,等值匹配条件的值。
-
rows: 预计需要扫描的行数。
-
filtered: 查询优化器估算的结果行的百分比。
-
Extra: 提供一些额外信息。
- Impossible WHERE: WHERE 子句永远为 FALSE。
- No tables used: 没有 FROM 子句。
- No matching min/max row: MIN 或 MAX 聚集函数找不到符合 WHERE 子句的记录。
- Using index: 索引覆盖。
四、Extended EXPLAIN
执行 EXPLAIN 后,使用 SHOW WARNINGS 查看与查询执行计划相关的扩展信息。
SHOW WARNINGS;
查看结果,可以得到关于查询重写后的语句等扩展信息。
五、总结
通过 EXPLAIN 和 SHOW WARNINGS,可以深入了解查询的执行计划,帮助进行数据库性能优化和调整查询语句。优化执行计划有助于提高查询性能和减少资源消耗。