索引回表和如何避免

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

在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列(必须符合左向原则)也可以。

你可能感兴趣的:(MySQL)