专门用来做SQL语句的调优的,在select语句前面加一个explain可以把SELECT的执行过程都列出来,包括哪些用了索引,哪些没用索引,哪些查询是全表查询,哪些是索引查询等。
1、Select_type
Select语句的类型,具体包括如下几种:
SIMPLE:简单SELECT(不使用UNION或子查询)
PRIMARY:最外面的SELECT
UNION:UNION中的第二个或后面的SELECT语句
DEPENDENT UNION:子查询中的UNION中的第二个或后面的SELECT语句
UNION RESULT:UNION 的结果
SUBQUERY:子查询中的第一个SELECT,子查询里没用UNION
select * from t_order where order_id=(select order_id from t_order where order_id=100);
DEPENDENT SUBQUERY:子查询中的第一个SELECT
DERIVED:导出表的SELECT(FROM子句的子查询)
select * from (select order_id from t_order where order_id=100) a;
下面这条SQL语句,Select_type分别是:Primary\Dependent subquery\Dependent union
select * from t_order where order_id in (select order_id from t_order where order_id=100 union select order_id from t_order where order_id=200);
2、Type
Select语句的联接类型,常用的几种类型如下所示:
const:
单表查询:根据主键或唯一索引,查出一条唯一数据记录
多表联合查询:根据主键或唯一索引,查出一条唯一数据记录
eq_ref:
多表联合查询:关联的字段都是各自表的主键。
ref:
单表查询:使用唯一索引的前缀索引、或非唯一索引的前缀索引、或非唯一索引的全列索引进行查询。
多表联合查询:关联的字段不是自己表的主键,是外键。
range:
单表查询:使用一个单列索引,或复合索引的前缀索引进行范围查询;
多表联合查询:使用一个单列索引,或复合索引的前缀索引进行范围查询。
index:
无Where语句:select后的列都是同一个索引里面的列
有Where语句:where后面是索引的非前缀索引列
ALL:
无Where语句: select后面有不是索引的列
有Where语句:where后面有不是索引的列
3、Extra
Usingindexcondition:
必带where语句,辅助索引扫描加回表
Usingindex:
无where语句:select后只跟主键
有where语句:select后只跟主键,where后跟主键查询
Using where;Using index:
必带where语句,且直接从辅助索引获取全部数据,即辅助索引的覆盖扫描
Usingwhere:
必带where语句,且where语句用不上索引
Usingfilesort:
使用非索引列进行order by 导致的排序,效率偏低,需要优化。
优化手段包括:
修改业务逻辑,不用SQL语句中进行order by
使用索引列进行order by
Usingtemporary:
多表关联left join时,on后面使用非直接关联会使用临时表。
优化手段包括:
修改业务逻辑,非直接关联转成直接关联
将非直接关联转为子查询