explain 语句速查

185 阅读3分钟

explain 语句可以帮忙我们分析索引的命中情况,可以通过慢查询日志找出系统中执行较慢的SQLexeesdfadf语句,再通过 explain 分析原因。

示例:

explain select * from employees where first_name = 'Georgi';

image.png

explain 字段解释

id

select查询的序列号,代表的是select执行的顺序,主要有以下三种情况:

  • id相同时,则按照从上到下依次执行
  • id不同时,id值越大优先级越高,越先被执行
  • id有相同有不同,则相同的id为一个组,不同组的id值按照规则二的优先级执行,同组id则按照规则一依次执行

select_type

select查询的类型,包括:

  • **SIMPLE:**表示该查询没有子查询和UNION连接查询
  • **PRIMARY:**有子查询时的最外层查询
  • UNION: union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
  • DEPENDENT UNION: 与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响
  • UNION RESULT: union的结果集
  • SUBQUERY: 子查询
  • **DEPENDENT SUBQUERY: **与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
  • **DERIVED: **在from中包含的select就称为derived(派生表)  ,mysql会递归这些子查询,把结果放在临时表中

table

执行当前SQL语句用到的表

partitions

当前表使用的分区

type

显示使用了何种查询,以下从优到坏的顺序为:system > const > eq_ref > ref > range > index > all

  • system: 表中只有一行数据或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index
  • **const:**使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描
  • **eq_ref:**出现在要连接多个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
  • **ref:**非唯一性索引的索引查找
  • **index:**索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
  • **all:**全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。

possible_keys

查询时可能使用到的索引

key

查询真正使用到的索引

key_len

使用到的索引长度(字节数),只统计在where条件后使用到的索引,排序和分组使用的不算。

ref

如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func

rows

执行计划中预估扫描到的行数

filtered

表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例

extra

给出一些额外但重要的信息,常见重要的信息有:

using index:使用了覆盖索引,以避免扫描表(良好情况)  
using filesort:索引创建数据排序方式不满足要求,mysql在外部重新排序(严重,需要优化)  
using temporary:mysql创建使用了临时表来保存信息(严重,需要优化) 
using where:使用了where  
using join buffer:在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果(需要增加索引进行优化)