Mysql分析执行计划

发布于 2023-06-08  295 次阅读


目标:执行计划是什么?如何分析执行计划

什么是执行计划

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
SUBQUERYSELECT列表中的子查询
DEPENDENT SUBQUERY依赖外部结果的子查询
UNIONUNION操作的第二个或者是之后的查询值为UNION
DEPENDENT UNION当UNION作为子查询时,第二或者第二个后查询的select_type值
UNION RESULTUNION产生的结果集
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表示查询使用了范围检查操作,即对每个记录都进行了范围检查。
届ける言葉を今は育ててる
最后更新于 2023-06-08