什么是回表?

327 阅读2分钟

面试官:来说说什么是回表?

大彬:嗯,通俗的讲就是,如果select所需获得列中有非索引列,一次索引查询不能获取所有信息,需要到表中找到相应的列的信息,这就叫回表

如果根据一次索引查询就能获得所有列信息,就不需要回表。举个例子,先创建一张表:

create table one_piece (
id int(10) not null,
name varchar(16),
gender varchar(8),
index (name),
primary key ('id') using btree
) engine = InnoDB;

插入几条测试数据:

idnamegender
1路飞male
2索隆male
3娜美male

假设,现在我们要查询出id为2的数据。执行查询语句select * from one_piece where ID = 2。这条SQL语句就不需要回表。(id为该表的主键)

面试官:为什么不需要回表呢?

大彬:嗯,原因是根据主键的查询方式,只需要搜索id这棵B+树。主键是唯一的,根据这个唯一的索引,MySQL就能确定搜索的记录。id为主键索引,主键索引是聚簇索引。

聚簇索引的叶子节点包含整个行记录,一次索引查询就能获取所有的信息。故不需要回表。

面试官:那什么情况下需要回表呢?

大彬:比如查询name为索隆的记录,使用查询语句select * from one_piece where name='索隆'。这个查询语句就需要回表

面试官:为什么呢?

大彬:原因是通过name这个普通索引查询方式,需要先搜索name索引树,然后得到主键id的值为2,再到id索引树搜索一次。

image.png

先定位主键值,再定位行记录。这个过程虽然用了索引,但实际上底层进行了两次索引查询,这个过程就称为回表。

也就是说,基于非主键索引的查询需要多扫描一棵索引树。我们在应用中应该尽量使用主键查询。

当表数据量很大的时候,可以很明显的看出两次查询所用的时间的差距,使用主键查询效率更高

面试官:不错,今天面试就到这里吧

原链接:www.bilibili.com/video/BV1tS…