MySQL的Explain使用
作用
可以帮助你分析你的慢SQL的执行细节,找出慢的根源,进而进行优化
分析
从图中可以看到执行结果,接下来按照每列进行解释:
id列:select查询的序列号,代表的是select执行的顺序,有以下几种情况
- 规则一:id相同时,则按照从上到下依次执行
- 规则二:id不同时,id值越大优先级越高,越先被执行
- 规则三:id有相同有不同,则相同的id为一个组,不同组的id值按照规则二的优先级执行,同组id则按照规则一依次执行
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行
select_type列:查询的类型
- SIMPLE:表示该查询没有子查询和UNION连接查询
- PRIMARY:有子查询时的最外层查询
- SUBQUERY:有子查询时的内层嵌套查询
- DERIVED:在from中包含的select称为derived(衍生) ,mysql会递归这些子查询,把结果放在临时表中
- UNION:union的第二个或者最后一个
- UNION RESULT:union的结果
table列:执行当前SQL语句用到的表
partitions列:代表当前表所使用的分区
type列:显示使用了哪种查询,查询效率排序为system > const > eq_ref > ref > range > index > all
- system、const:mysql能队这部分进行查询优化,使能够将其转换成一个常量(system只返回一行,const有多行),如某一行的主键放入WHERE子句里的方式来选取此行的主键,mysql就能讲这个查询转换成一个常量,然后高效的将表从连接执行中移除。
- eq_ref: 使用该索引查找,mysql最多返回一条数据,可以在使用主键或者唯一性索引查找时用到
- ref:非唯一性索引的索引查找
- range:范围扫描,例如带有between或者 >,<,in 等
- index:扫描所有索引行
- all:扫描所有数据行
possible_keys列:代表可能用到的索引和实际用到的索引
key列:显示mysql实际采用哪个索引优化对该表的查询
key_len列:在索引中使用的字节数,通过这个值可以算出具体使用了索引中哪些字段
key_len计算规则:
- 字符串
- char(n):n字节长度
- varchar(n):需要占用2字节存储字符串长度,如果字符类型为utf8,则长度为3n+2
- 数值类型
- tinyint:1字节
- smallint:2字节
- int:4字节
- bigint:8字节
- 时间类型
- date:3字节
- timestamp:4字节
- datetime:8字节
- 如果字符允许为null,需要1字节记录是否为null
索引最大长度是768字节,当字符串过长时,MySQL会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引
ref列:显示在key列记录的索引中,表查询值所用到的列或常量,常见的有const(常量),字段名
rows:是mysql估计要读取并检测的行数(不是结果集里的行数)
filtered:是一个百分比值,和rows列的值一起使用,可以估计出那些将要和QEP中的前一个表进行连接的行数。前一个表是指id列的值比当前表的id小的表
Extra:显示额外信息,常见值有:Using index,Using where,Using where Using index,null
- Using index:查询的列被索引覆盖,并且where筛选条件是索引的前导列,是性能高的表现。一般是使用了覆盖索引(索引包含查询的所有字段),对于innodb来说,如果是辅助索引性能会有不少提升。
- Using where:查询的列未被索引覆盖,where筛选条件非索引的前导列。
- Using where Using index:查询的列未被索引覆盖,并且where筛选条件是索引列之一,但不是索引的前导列,一位置无法直接通过索引查找来查询数据。
- NULL:查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过回表实现,不是纯粹的用到了索引,也不是完全没有用到索引
- Using index condition:与Using where类型,查询的列不完全被索引覆盖,where条件中是一个前导列的查询范围。
- Using temporary:mysql需要创建一张临时表来处理查询,出现这种情况一般要进行优化
- Using filesort:mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行,此时mysql会根据连接类型浏览符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息,这种情况下一般需要考虑使用索引来优化查询。
|