图解Explain的type字段(Mysql)
作者:互联网
在学习explain的时候,感觉比较重要且麻烦的就是type字段,故本文通过图表解释了相关问题。
看前提醒:本文需要B+树基础。
1、基本介绍
1.1表结构介绍
共两个表,book与book_order.
![](https://pic4.zhimg.com/80/v2-8d39cc21621a27bd53d11a4c9d67bacf_720w.jpg)
![](https://pic4.zhimg.com/80/v2-21b086d56f0e1acbd4dce68c637d9977_720w.jpg)
1.2表结构图示
![](https://pic4.zhimg.com/80/v2-507c32252c96cb3e720ec2643182e6eb_720w.jpg)
2、结合案例图解
从性能从低到高进行排序
2.1 all
EXPLAIN SELECT * FROM book WHERE NAME = 'book1'
![](https://pic2.zhimg.com/80/v2-fcbe5225adcb52119424042f36fa7b69_720w.png)
由于B+树的实际数据是存储在主键索引的叶子节点上的,所有就相当于遍历主键索引的叶子节点对应的数据。
![](https://pic3.zhimg.com/80/v2-9cac83d891fa3b7e0c6c0fd05d85212a_720w.jpg)
2.2 index
只需要遍历索引树就可以得到所需要的结果,不需要访问具体的数据。
EXPLAIN SELECT COUNT(*) FROM book
![](https://pic1.zhimg.com/80/v2-f808038648f60ed746a4b3d950bbe104_720w.png)
![](https://pic1.zhimg.com/80/v2-7bbe7c760dfaf8d3045f9d1d6d3205ac_720w.jpg)
2.3 range
当where语句后面出现>或者<等的时候会出现。
EXPLAIN SELECT * FROM book WHERE id < 2
![](https://pic3.zhimg.com/80/v2-4e590dbb2661cd8e5050763d707f6b52_720w.png)
2.4 ref 与 eq_ref
这两个比较像,首先请看以下语句。
EXPLAIN SELECT * FROM book b,book_order bo WHERE b.number = bo.buy_number
![](https://pic3.zhimg.com/80/v2-6e466b94b7139ee1258404fb60eee526_720w.png)
首先执行的是book_order,type为all表示遍历所有的记录。
然后,将每个buy_number作为查询的值放入到book的number索引中进行查找。(从ref字段为bo.buy_number也能看出)
![](https://pic1.zhimg.com/80/v2-cd83f25f03764038f2654013442612d8_720w.jpg)
如果索引中有多个值与buy_number对应,那么type为ref,如果只有一个值对应,那么结果就是eq_ref。
2.5 const与system
EXPLAIN SELECT * FROM book WHERE id = 2
查找的值为一个常数(2),并且表中有多条记录;若表中只有一条记录,则type为const。
标签:ref,Explain,number,索引,book,Mysql,type,EXPLAIN,SELECT 来源: https://www.cnblogs.com/coder-dai/p/16213649.html