这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
前言
相信大家对于Explain并不是特别陌生,它就是用来查看执行计划的一个命令,同时它也只是会对Select起作用的一个命令,当我们在Select语句的最前面加入Explain的时候,会出现这样的一份表格。
我们通过解读这份表格的内容,从而来可以尝试写出一些更加优化的Sql语句。
但是对于新手玩家来说,想要解读这一份表格并不是那么的容易,今天我就说一下到底要怎么解读Explain中的各个列的内容。
基础认识
首先我们知道的是,要使用explain只需要在select语句前面加上一个explain就可以了,当我们执行查询的时候,它会返回的是一个执行计划,而不是把结果给返回过来,也就可以看到上面图中所看到的那些数据了。
EXPLAINZ中的各个列
虽然EXPLAIN有很多的列,但是实际上我们需要关心的,也就是我们在排查慢查询的时候,需要注意的关键列一共有三个,那我们就来一次解析,怎么去看这几个列的内容:
SELECT_TYPE列
这一列的主要显示的是查询的内容是属于简单的还是说是复杂的。
它内部有几个比较重要的参数:SUBQUERY(包含在子查询中的SELECT),DERIVED(表示包含在FROM里面的子查询),UNION(当使用UINON的时候会出现)。
TYPE列
这列主要是来显示关联类型,也就是通过这列我们可以知道MYSQL是如何查找表中的行的,下面是最重要的访问方式,按照效率从最差到最优:
-
ALL:这就i是人们常说的全表扫描,也就是效率最差的一种查询方式。
-
INDEX:这种跟全表扫描有点像,但是区别是它有一个优点就是避免了排序,最大的一个缺点是承担了按照索引次序读取整个表的一个开销。
-
RANGE:范围扫描,它比全表扫描好的一个地方就是,它是对数据的一个范围进行了一个扫描,而不是扫描全表,相对于全表扫描来说,是要好很多的。
4. REF:这是一种索引的访问,它会返回所有匹配上的某个值的那个行,这类索引只有在访问只有当使用非唯一索引或者唯一索引的非唯一索引前缀的时候,才会发生。
5.EQ_REF:同上面的差不多,唯一的区别就是,它只是返回单挑的一个数据。
- NULL:这种访问方式意味着Mysql在优化的阶段就可以分解查询语句了,甚至都用不着在访问表或者是索引。
最后
这是我一篇补卡文章,写的有些潦草,后续再改过