文章目录
数据库 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 执行情况的描述和详细说明