索引回表和如何避免

今天回答一个网友的问题,记录内容如下。

在SQL查询语句执行时,如果对表内2次或以上索引查询称之为回表。两次索引查询是怎么发生的的?举个例子来说明,有一个x表,id字段是主键,a字段是辅助索引,总字段数量10个。sql如下:
select * from x where id=100;
这个语句只访问主键一次,不会回表。
sql改为如下:
select * from x where a=100;
这个语句在访问辅助索引后还需要访问主键,因此是回表。
我们知道主键包含行所有数据(这里假设是使用了InnoDB),辅助索引只存储键值以及一个书签。这个SQL要取行所有数据,因此需要通过书签指向主键来读取全部行信息。
进行2次访问,比只访问1次效率可能要低一些。因此要尽可能避免。
避免的方法主要有2点:
1.尽量使用主键
2.如果必须使用辅助索引,那么尽量避免使用*,直接列出所需列名。如果所需数据仅包含辅助索引列,那么它将不读取主键,因为辅助索引包含辅助索引列的值。
所以第二条sql改写如下可以避免回表。
select a from x where a=100
辅助索引可能包含有多列,使用其中1列(必须符合左向原则)也可以。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乐大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值