const、eq_ref、ref、ref_or_null、index、all的简介

一、const

select * from user where id = 1
select * from user where name = '张三'

以上面俩个sql为例,第一个sql执行可以通过聚簇索引查找到数据,第二个sql可以通过以name字段建立的二级索引+聚簇索引回表找到数据。这种根据索引直接可以快速找到数据的过程,在执行计划中称之为:const,意思就是性能超高的常量级的。所以你以后在执行计划中看到const的时候,就知道他就是直接通过索引定位到数据,速度极快,这就是const的意思。

二、eq_ref

但是这里有一个要点,你的二级索引必须是唯一索引,才是属于eq_ref方式的,也就是说你必须建立unique key唯一索引,保证一个二级索引的每一个值都是唯一的才可以

三、ref

那么如果你的是一个普通的二级索引呢?就是普通的key索引,这个时候如果你写一个

select * from user where name = '张三'

name是个普通二级索引,不是唯一索引,那么此时这种查询速度也是很快的,他在执行计划里叫ref。如果你是包含多个列的普通索引的话,那么必须是从索引最左侧开始连续多个列都是等值比较才可以是属于ref方式,就是类似于:select * from user whre name = '张三' and age = 1 and sex = 1 。然后索引可能是个key(name,age,sex)。

四、ref_or_null

如果你用name is null这种语法的话,即使name是主键或者唯一索引,还是只能ref方式,但是如果你是针对一个二级索引同时比较了一个值还是限定了 is null ,类似于select * from user where name = '张三' or name is null ,那么此时在执行计划中就叫 ref_or_null

说白了,就是在二级索引里搜索你要的值以及是null的值,然后再回表到聚簇索引中查询。因为同时有索引等值比较和null值查询,就叫做ref_or_null了

五、range

例如下sql:select * from user where age >= 1 and age <= 12 , 假设age就是一个普通索引,此时就是必然利用索引来进行范围筛选,一旦利用索引做了范围筛选,那么这种方式就是range

六、index

假设我们有一个表,里面完整的字段联合索引是key(x1,x2,x3),现在我们写一个sql语句:select x1,x2,x3 from user where x2 = xxx ,相信大多数同学看到这里,都会觉得完蛋了,x2不是联合索引的最左侧的那个字段。对的,这个sql是没有办法直接从联合索引树的根节点开始二分查找,快速一层一层跳转的,那么他会怎么执行呢?其实这个sql要查询的几个字段,就是联合索引里的几个字段。所以针对这种sql,在实际查询的时候,就会直接遍历key(x1,x2,x3)这个联合索引的索引树的叶子节点,大家还记得聚簇索引和普通索引叶子节点分别放了什么吗?

聚簇索引的叶子节点放的是完整的数据页,里面包含完整的一行一行的数据,联合索引的叶子节点放的也是页,但是页里每一行就是x1,x2,x3和主键的值。

所以此时针对这个sql,会直接遍历key(x1,x2,x3)索引树的叶子节点的那些页,一个接一个的遍历,然后找到x2=xxx的那一数据,就把里面的x1,x2,x3三个字段的值直接提取出来就可以了,这个遍历二级索引的过程,要比遍历聚簇索引快多了,比较二级索引叶子节点就包含几个字段的值,比聚簇索引叶子节点小多了,所以速度也快。

也就是说:此时只要遍历一个key(x1,x2,x3)索引就可以了,不需要回源到聚簇索引去,针对这种只要遍历二级索引就可以拿到你想要的数据,而不需要回源到聚簇索引的访问方式,就叫做index访问方式

七、all

all的情况就是:全表扫描。

综上所述:

一、type:连接类型 最关键的一列 效率(const>eq_ref>ref>range>index>all)

1、const:查询索引字段,并且表中最多只有一行匹配(好像只有主键查询只匹配一行才会是const,有些情况唯一索引匹配一行会是ref)

2、eq_ref 主键或者唯一索引

3、ref 非唯一索引(主键也是唯一索引)

4、range 索引的范围查询

5、index (type=index extra = using index 代表索引覆盖,即不需要回表)

6、all 全表扫描(通常没有建索引的列)

借道友法力一用:

========================== stay hungry stay foolish =============================

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值