86 以MySQL单表查询来举例,看看执行计划包含哪些内容(1)
const
我们之前都知道,假设你写一个select * from table where id=x
,或者select * from table where name=x
的语句,直接就可以通过聚簇索引
或者二级索引+聚簇索引
回源,轻松查到你要的数据,这种根据索引直接可以快速查找数据的过程,在执行计划里称之为const,意思就是性能超高的常量级的。
所以你以后在执行计划里看到const的时候,就知道他就是直接通过索引定位到数据,速度极快,这就是const的意思。
但是这里有一个要点,你的二级索引必须是唯一索引,才是属于const方式的,也就是说你必须建立unique key
唯一索引,保证一个二级索引的每一个值都是唯一的,才可以。
ref
那么如果你是一个普通的二级索引呢?就是个普通的KEY索引,这个时候如果你写一个select * from table where name=x
的语句,name是个普通二级索引,不是唯一索引,那么此时这种查询速度也是很快的,他在执行计划里叫做ref。
如果你是包含多个列的普通索引的话,那么必须是从索引最左侧开始连续多个列都是等值比较才可以是属于ref方式,就是类似于
select * from table where name=x and age=x and xx=xx
然后索引可能是个KEY(name,age,xx)。
ref_or_null
然后一个例外,就是如果你用 name IS NULL 这种语法的话,即使name是主键或者唯一索引,还是只能走ref方式。但是如果你是针对一个二级索引同时比较了一个值还有限定了IS NULL,类似于
select * from table where name=x or name IS NULL
那么此时在执行计划里就叫做ref_or_null。
说白了,就是在二级索引里搜你要的值以及是NULL的值,然后再回源去聚簇索引里查罢了,因为同时有索引等值比较和NULL值查询,就叫做ref_or_null
了,其实也没啥。
如果你看到了ref是什么意思?对,就是用了普通的索引,或者用主键/唯一索引搞了一个IS NULL/IS NOT NULL。
不管怎么说,只要你看到const或者ref,那恭喜你,说明起码这部分执行速度是很快的!