在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列(必须符合左向原则)也可以。
索引回表和如何避免
最新推荐文章于 2024-08-05 23:09:05 发布
回表是指在SQL查询中,由于需要获取完整行数据,从辅助索引回溯到主键索引的过程,降低查询效率。文章通过实例解释了回表的概念,并提出两种避免回表的方法:优先使用主键查询,或在使用辅助索引时明确指定所需列,以减少数据读取次数。
摘要由CSDN通过智能技术生成