Explain使用与详解
分析sql的执行计划,用了什么索引,扫描都少行 Explain的两个变种: explain extend: show warning:展示sql语句大概会做哪些优化
-
id--id越大执行的优先级越高,越小执行的优先级越低
-
select_type----表示对应行是简单查询还是复杂查询,select_type下会展示每一条select语句查询的类型。
- primary:复杂查询中,最外层的select
- subquery:包含在select中的子查询(不再from子句中)
- derived:衍生查询
-----seletc_type还有其他的类型
-
partition----一般不用
-
type--通过这个值可以判断sql语句执行的效率大概是什么样子,从最优到最差依次是:system >const>eq_ref>ref>range>index>all,优化的时候一般来说得保证达到range级别,最好达到ref级别
-
eq-ref---如果一条sql语句通过expalin展示出来是eq_ref其实不用做太多的额优化
-
ref---这条sql语句查询的时候没有用到主键或者唯一键,查出来多条语句,用了普通索引,而没用唯一索引,也有可能用到唯一索引的部分前缀
-
二级索引中有索引字段和主键id,Mysql内部有个优化的原则,通过查找结果集的分析,如果结果集中的几个字段,在主键索引中也有,在二级索引中也有,会优先选择二级索引查,因为二级索引小,主键索引扫描时的数据量比二级索引大
5.index---- 对于一个查询语句,虽然用到了索引,但是type字段下显示ref和index是完全不一样的,ref相对来说效率更高,从根节点,按照折半查找定位某一个元素,效率非常高。index则从聚簇索引扫描全部的索引
6.key-len----通过key-len可以知道你用到联合索引中的哪个索引 如果字段允许位null值,需要亿字记录是否为null
7.Extra
-
using index----使用覆盖索引,覆盖索引并不是一种索引,是一种查询的方式 ,查寻的结果字段,在索引树中全部包括,通过索引树就能够直接查询到结果集,不需要回表
-
using where:使用where语句来处理结果,并且查询的列未被索引覆盖
-
using Index condition 用到联合索引的第一个列,并且这个列是范围查找
-
using temporary 用到临时表
索引最佳实践
不在索引列上做任何的操作
is null,is not null一般情况下页不走索引
like查询一通配符开头,索引失效会变成全表扫描
少使用or/in,用它查询时不一定使用索引