数据库 MySql 执行计划分析

文章目录

数据库 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      <unionM,N,...>:该行指的是 id 值为 M 和 id 值为 N 的并集。
derived    <derivedN>:该行是指用于与该行的派生表结果 id 的值 N。 例如,派生表可以来自 FROM 子句
subquery   <subqueryN>:该行指的是 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 执行情况的描述和详细说明
上一篇:LeetCode 679 24点游戏


下一篇:十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统(附源码)