目标:执行计划是什么?如何分析执行计划
什么是执行计划
MySQL执行计划(Execution Plan)是数据库系统在执行查询语句时生成的查询执行策略的描述。它显示了MySQL优化器选择的查询执行方式,包括使用哪些索引、如何连接表、执行操作的顺序等信息。
在MySQL中,可以使用EXPLAIN
关键字来获取查询的执行计划。以下是使用EXPLAIN
获取执行计划的基本语法:
-- 执行计划基本用法
EXPLAIN SELECT column1, column2, ...
FROM table
WHERE condition;
分析执行计划
MySQL会返回一个描述查询执行计划的结果集。结果集中的各列提供了有关查询执行方式的详细信息
- id:标识查询中的每个操作的唯一标识符。
- select_type:描述了操作类型,例如简单查询、子查询、联接等。
- table:表示涉及的表。
- partitions:表示涉及的分区表。
- type:表示表的连接类型,如全表扫描、索引扫描、范围扫描等。
- possible_keys:表示查询时可能使用的索引。多个索引以逗号分隔。
- key:表示查询使用的索引。
- key_len:表示索引使用的字节数
- ref:对于联接操作,表示连接条件使用的列。
- rows:表示每个操作扫描的行数。
- Extra:显示附加信息,例如排序、临时表等。
id列
- 标识查询中的每个操作的唯一标识符。
- ID表示查询执行的顺序
- ID是由上到下执行的
- ID不同由大到小执行
select_type列
值 | 含义 |
SIMPLE | 不包含子查询或是UNION操作查询 |
PRIMARY | 查询中如果包含任何子查询,那么最外层的查询则被标记为PRIMARY |
SUBQUERY | SELECT列表中的子查询 |
DEPENDENT SUBQUERY | 依赖外部结果的子查询 |
UNION | UNION操作的第二个或者是之后的查询值为UNION |
DEPENDENT UNION | 当UNION作为子查询时,第二或者第二个后查询的select_type值 |
UNION RESULT | UNION产生的结果集 |
DERIVED | 出现在FROM子句的子查询 |
table列
- 表示涉及的表。
- <union M,N>由ID为M,N查询Union产生的结果集
- <derived N> / <subqueery N>由ID为N的查询产生的结果
partitions列
- 显示查询的分区表ID
- 对于非分区表,先是NULL
type列
性能 | 值 | 含义 |
高 | system | 表示表只有一行,通常是由于访问系统表或常量表。 |
高 | const | 表示基于常量条件的等值访问,即查询条件中的值是常量,并且只能匹配一个结果。 |
高 | eq_ref | 表示基于唯一索引的等值访问,通常出现在连接操作中,使用的是索引的主键或唯一键。 |
高 | ref | 表示基于普通索引的等值访问,通常出现在连接操作中,使用的是索引的非唯一键。 |
高 | ref_or_null | 表示使用普通索引的等值访问,但还包括对NULL值的匹配。 |
一般 | index_merge | 表示使用多个索引进行合并扫描。 |
一般 | range | 表示使用索引的范围扫描,根据索引的范围条件进行访问。 |
一般 | index | 表示进行全索引扫描,即扫描整个索引树而不访问数据行。 |
低 | all | 表示全表扫描,遍历整个表的所有数据行。 |
keys相关列
possible_keys列
表示查询时可能使用的索引。多个索引以逗号分隔。
keys列
实际使用的索引。如果为NULL,则表示没有使用索引。
key_len列
表示索引使用的字节数
Extra列
值 | 含义 |
Using index | 表示查询使用了覆盖索引,即只通过索引就可以满足查询的需求,无需访问实际的数据行。 |
Using where | 表示查询使用了WHERE子句中的条件进行过滤。 |
Using temporary | 表示查询使用了临时表来存储中间结果集。这通常发生在查询中包含GROUP BY、ORDER BY、DISTINCT等操作时。 |
Using filesort | 表示查询需要进行文件排序操作,即对结果集进行排序。这可能发生在查询中包含ORDER BY操作时。 |
Using join buffer | 表示查询使用了连接缓冲区进行连接操作。 |
Impossible where | 表示查询的WHERE子句包含了不可能满足的条件,导致查询结果为空。 |
Full scan on NULL key | 表示对于某个索引,MySQL需要进行全表扫描来处理具有NULL键值的情况。 |
Select tables optimized away | 表示查询优化器通过优化操作将一些无用的表过滤掉,从而提高查询效率。 |
Distinct | 表示查询包含DISTINCT操作,用于返回唯一的结果。 |
Range checked for each record | 表示查询使用了范围检查操作,即对每个记录都进行了范围检查。 |
Comments NOTHING