文章目录


数据库 MySql 执行计划分析


1、关键字

​explain​​ 查询 SQL 的执行计划

​explain extended​​ 会在 explain 的基础上额外提供一些查询优化的信息。 紧随其后通过 show warnings 命令可以 得到优 化后的查询语句,从而看出优化器优化了什么

​explain partitions​​ 相比 explain 多了个 partitions 字段, 如果查询是基于分区表的话,会显示查询将访问的分区。

目前 explain 会直接带 partitions 字段了

2、explain 结果列

id  select_type  table  partitions  type  possible_keys  key  key_len  ref  rows  filtered  Extra

3、可能值

​select_type​​ 可能值

SIMPLE:简单查询。查询不包含子查询和 union
PRIMARY:最外层 SELECT
UNION:第二层,在 SELECT 之后使用了 UNION。
DEPENDENT UNION:UNION语句中的第二个 SELECT,依赖于外部子查询。
UNION RESULT:UNION 的结果
SUBQUERY:子查询中的第一个 SELECT。
DEPENDENT SUBQUERY:子查询中的第一个 SELECT,取决于外面的查询。
DERIVED :导出表的 SELECT(FROM 子句的子查询)
MATERIALIZED:物化子查询
UNCACHEABLE SUBQUERY:无法缓存结果的子查询,必须为外部查询的每一行重新计算
UNCACHEABLE UNION :UNION 属于不可缓存的子查询的第二个或后一个选择

​table​​ 可能值

union      :该行指的是 id 值为 M 和 id 值为 N 的并集。
derived :该行是指用于与该行的派生表结果 id 的值 N。 例如,派生表可以来自 FROM 子句
subquery :该行指的是 id 值为的行的具体化子查询的结果 N
NULL

​type​​ 可能值

NULL            MySQL 在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
system 该表只有一行(如:系统表)。这是 const 连接类型的特例
const 该表最多只有一个匹配行,在查询开头读取。因为只有一行,所以优化器的其余部分可以将此行中列的值视为常量。const 表非常快
因为它们只读一次。SELECT * FROM tbl_name WHERE primary_key=1;
eq_ref 除了 system 和 const类型之外,这是最好的连接类型。当连接使用索引的所有部分且索引是 PRIMARY KEY 或 UNIQUE NOT NULL 索引时使用它。
ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
fulltext 使用 FULLTEXT 索引执行连接。
ref_or_null 该联接类型如同 ref,但是添加了 MySQL 可以专门搜索包含 NULL 值的行。SELECT * FROM ref_table WHERE key_column IS NULL;
index_merge 该指数合并访问方法检索与多行 range 扫描和他们的结果合并到一个。 此访问方法仅合并来自单个表的索引扫描,而不扫描多个表。
unique_subquery 该类型替换了下面形式的 IN 子查询的 ref:
value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery
是一个索引查找函数,可以完全替换子查询,效率更高。【不常用】
index_subquery 该联接类型类似于 unique_subquery。可以替换 IN 子查询,但只适合下列形式的子查询中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)。【不常用】
range 只检索给定范围的行,使用一个索引来选择行。
index 该联接类型与 ALL 相同,Full Index Scan,index 与 ALL 区别为 index 类型只遍历索引树。
这通常比 ALL 快,因为索引文件通常比数据文件小。
ALL Full Table Scan, MySQL 将遍历全表以找到匹配的行。

possible_keys   可能使用的索引
key 实际使用的索引
key_len 显示的是索引字段的最大可能长度,不是实际使用长度
ref 使用哪个列或常数
rows MySql 认为它执行查询时必须检查的行数。( 扫描出的行数 [估算的行数 ]。)
filtered 通过表条件过滤出的行数的百分比估计值
Extra MySql 执行情况的描述和详细说明