explain 语句可以帮忙我们分析索引的命中情况,可以通过慢查询日志找出系统中执行较慢的SQLexeesdfadf语句,再通过 explain 分析原因。
示例:
explain select * from employees where first_name = 'Georgi';
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:在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果(需要增加索引进行优化)