Explain详解与最佳实践原则

101 阅读2分钟

Explain使用与详解

分析sql的执行计划,用了什么索引,扫描都少行 Explain的两个变种: explain extend: show warning:展示sql语句大概会做哪些优化

image.png

  1. id--id越大执行的优先级越高,越小执行的优先级越低

  2. select_type----表示对应行是简单查询还是复杂查询,select_type下会展示每一条select语句查询的类型。

    • primary:复杂查询中,最外层的select
    • subquery:包含在select中的子查询(不再from子句中)
    • derived:衍生查询

-----seletc_type还有其他的类型

  1. partition----一般不用

  2. 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,用它查询时不一定使用索引