explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
一. explain语句中用于判断是否可优化的字段:
1. select_type:
1)simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个。
2)primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个。
3)union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union。
4)dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响。
5)union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null。
6)subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery。
7)dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响。
8)derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select。
2. type:
1)system:系统表,少量数据,不需要磁盘IO。
2)const:常量连接。
3)eq_ref:主链索引或非空唯一索引等值扫描。
4)ref:非主链,非唯一索引等值扫描。
5)range:范围扫描。
6)index:索引扫描。
7)all:全表扫描。
3. extra:
1)using where:sql使用了where条件过滤数据。
2)using index:sql需要返回的所有列数据均在一棵索引树上,而无需访问实际的行记录。
3)using index condition:确实命中了索引,但不是所有列数据都在索引树上,还需要访问实际的行记录。
4)using filesort:得到所需结果集,需要对所有记录进行文件排序。典型的,在一个没有建立索引的列上进行了order by,就会触发filesort。优化方案:在order by 的列上添加索引,避免每次查询都全是排序。
5)using temporary:需要建立临时表来暂存中间结果。这类sql语句性能较低。典型的,group by和order by同时存在,且作用于不同的字段时,就会建立临时表,以便计算出最终结果集。