MySQL 中的回表是什么?

Sherwin.Wei Lv7

MySQL 中的回表是什么?

回答重点

“回表” 是指在使用二级索引(非聚簇索引)作为条件进行查询时,由于二级索引中只存储了索引字段的值和对应的主键值,无法得到其它数据。如果要查询数据行中的其它数据,需要根据主键去聚簇索引查找实际的数据行,这个过程被称为回表

扩展知识

进一步理解回表

举个例子:select * from user where age = 20;(user 包含 name、age、id 三个字段。假设 MySQL 优化器确定使用 age 索引)

1)根据二级索引(age)找到 age = 20 的 主键键值:

image-20240503133710205.png

2)由于查询条件是 select * ,需要 name、age、id 三个字段,而 age 索引内没有 name 字段,因此还需要再根据主键去查找整行的数据:

image-20240503133904146.png

最终得到 2、小鱼、20 三个数据。

回表其实不仅仅只是多查一次,还会带来随机 I/O

因为通过 id 去主键索引查询的时候,id 肯定是不连续的(例如 age 为 20 的人很多,age 索引中年龄是有序的,但是 id 无序,且是不连续的),所以去主键索引频繁查询会造成大量随机 I/O ,我们都知道顺序 I/O 查询快,而随机 I/O 慢,所以频繁回表效率很低。

因此,不要因为图方便,在代码里都用 select * ,从而引发不必要的回表操作。

Comments