目录
mysql Explain详解
explain声明
DESCRIBE
和EXPLAIN
语句是同义词。实际上,DESCRIBE
关键字通常用于获取有关表结构的信息,而EXPLAIN
用于获取查询执行计划(即,有关MySQL如何执行查询的说明)
EXPLAIN
语句提供有关MySQL如何执行语句的信息。EXPLAIN
可作用于SELECT
,DELETE
,INSERT
,REPLACE
,和UPDATE
语句
explain列说明
id
SELECT
标识符,id列越大,执行优先级越高,id相同则从上往下执行,id为null,则最后执行有几个select关键字就有几个id
select_type
SELECT
类型,表示对应行是简单查询还是复杂查询
列举所有的字段值:
SIMPLE:简单查询,查询语句不包含子查询与union
PRIMARY:复杂查询最外层的select,在主select关键字后
SUBQUERY:包含在select中的子查询(不在from子句中),在select关键字后
DERIVED:临时表,衍生表,在from关键字后
UNION:查询语句使用了union
DEPENDENT UNION:第二个或更高版本的select语句
union
,取决于外部查询UNION RESULT:结果union
DEPENDENT SUBQUERY:首个select在子查询中,取决于外部查询
MATERIALIZED:被物化的子查询
UNCACHEABLE SUBQUERY:子查询,其结果无法缓存,必须针对外部查询的每一行重新进行评估
UNCACHEABLE UNION:不可缓存子查询的中的第二个或更高版本的选择
table
输出表所引用的表的名称,查询的是哪一张表
type
联结类型,表示关联类型或者访问类型,一般至少保证达到range级别,最好达到ref级别
主要类型访问速度:system > const > eq_ref > ref > range > index > all
列举所有的字段值:
null:mysql在优化阶段分解查询语句,在执行阶段用不着在访问表或索引,例如:在索引中选取索引最小值,可以单独查找索引,不需要在执行时访问表
system:系统表,
const
联接类型的特例const:条件为主键,且查询结果只有一条数据
eq_ref: 唯一索引的所有部分被连接使用,且最多返回一条符合条件的记录,简单的select类型不会出现这种type
ref: 相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一索引的前一部分前缀,可以出现多个匹配行
range: 范围使用索引查询
index: 一般扫描某个二级索引,不会从索引树根节点开始快速查找,而是直接对索引的叶子节点遍历和扫描,速度较慢,这种查询一般为覆盖索引,二级索引一般较小,所以这种通常比all快一点
all: 全表扫描,扫描你的聚簇索引的所有叶子节点
fulltext: 使用
FULLTEXT
索引执行联接ref or null: 此连接类型类似于
ref
,但是除了MySQL对包含NULL
值的行进行了额外的搜索之外。此联接类型优化最常用于解析子查询index merge: 此联接类型指示使用索引合并优化。在这种情况下,
key
输出行中的列包含所用索引的列表,并key_len
包含所用索引 的最长键部分的列表unique subquery: unique subquery只是一个索引查找函数,它完全替代了子查询以提高效率
index subquery: 此连接类型类似于 unique subquery 。它替代
IN
子查询,但适用于以下形式的子查询中的非唯一索引
possible_keys
可能使用到哪些索引会出现两种情况:1. possible_key有列,而key显示null的情况,就是因为表中数据不多,使用索引查找帮助不是很大,所以选择全表
2. 如果possible_key为null,则没有相关的索引,通常可以创建一个适当的索引来提高查询性能
key
这一列显示mysql实际采用哪个索引来优化该表的访问,如果mysql没有使用索引,可以强制使用force index,ignore index
key_len
key_len越小,索引效果越好,这一列显示mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的那些列, 如果该key
列显示 NULL
,则该key_len
列也显示NULL
。由于密钥存储格式的原因,可以使用的列的密钥长度NULL
比使用NOT NULL
列的密钥长度大一。
key_len计算规则:
char(n):如果存汉字长度就是 3n 字节
varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为varchar是变长字符串
数值类型
tinyint:1字节
smallint:2字节
int:4字节
bigint:8字节
时间类型
date:3字节
timestamp:4字节
datetime:8字节
如果字段允许为 NULL,需要1字节记录是否为 NULL
ref
这一列显示key记录中的索引,表查找值所用到的列或常量,常见的有:const(常量),字段名(film.id)
rows
这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的实际行数
extra
显示额外信息
常用的字段值:
Using index:使用索引覆盖
Using where:使用where语句来处理结果并且查询的列未被索引覆盖
Using index condition:查询的列不完全被索引覆盖,where条件是一个前导列的范围
Using temporary: mysql需要创建一张临时表来处理查询,出现这种情况一般是需要优化的,首先需要想到索引优化
Using filesort:使用外部排序而不是索引排序数据较小时从内存排序,否则需要在磁盘中完成排序,这种情况一般考虑使用索引优化
Select tables optimized away:使用某些聚合函数(比如max,min)来访问存在索引的某个字段
索引覆盖:整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引数找到主键,再通过主键去主键索引树里获取其他的字段值(不需要进行回表操作)
partitions
查询将从中匹配记录的分区。该值适用NULL
的未分区的表
下一篇 mysql优化