什么是回表查询?如何避免回表查询?

我们在索引中,有一种叫做聚集索引和非聚集索引的索引类型。
在聚集索引中,B+树上会存储这一行的全部数据,但是非聚集索引只会存储该列对应的值和相应行的主键。

是不是聚集索引的定义与主键索引很像?

其实就是的,当我们没有定义主键索引时,MYSQL会指定从左到有的第一个加了唯一索引和非空约束的列建立聚集索引,用它来代替主键索引。

聚集索引≈主键索引=唯一性约束+非空约束

那我们说了这么多?到底什么是回表查询呢?

比如有这么一张表 id name sex type
id为主键,name建立了普通索引。
比如我写下面的查询语句

select * from table where name ='ls'

由于name列建立的普通索引,那么就会去走name索引,但是我们发现 name索引里面只存放了name值和对应的主键 id,并找不到我们要的 sex type的信息。那么怎么办呢?
就必须重新去主键索引查找相关值。
因为主键索引存放了这一行的完整信息,但name没有。

就会发生下面的场景
在这里插入图片描述
回表查询其实就执行了两次B+树查询,这是一个既费时又费力的操作。
因此,我们要尽可能的避免回表查询。

我们再来看看回表查询的本质是什么?是不是普通索引找不到我们要的完整信息,迫不得已要执行回表查询,再回到主键索引或者聚集索引中查询数据。

那么解决回表查询的关键就是:索引覆盖

怎么理解呢?
比如

select id name from table where name ='ls'

这个就不会执行回表查询

select id name sex from table where name ='ls'

这个就要执行回表查询,因为sex在name索引上根本查不到。

那么怎么解决呢?
就是name 与 sex 可以建立联合索引。
这就是索引覆盖,大家可以感受一下。让索引范围覆盖住我们select 的范围,就不会发生回表查询。

  • 52
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你们卷的我睡不着QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值