MySQL 中的回表是什么?
MySQL 中的回表是什么?
回答重点
“回表” 是指在使用二级索引(非聚簇索引)作为条件进行查询时,由于二级索引中只存储了索引字段的值和对应的主键值,无法得到其它数据。如果要查询数据行中的其它数据,需要根据主键去聚簇索引查找实际的数据行,这个过程被称为回表。
扩展知识
进一步理解回表
举个例子:select * from user where age = 20;(user 包含 name、age、id 三个字段。假设 MySQL 优化器确定使用 age 索引)
1)根据二级索引(age)找到 age = 20 的 主键键值:

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

最终得到 2、小鱼、20 三个数据。
回表其实不仅仅只是多查一次,还会带来随机 I/O。
因为通过 id 去主键索引查询的时候,id 肯定是不连续的(例如 age 为 20 的人很多,age 索引中年龄是有序的,但是 id 无序,且是不连续的),所以去主键索引频繁查询会造成大量随机 I/O ,我们都知道顺序 I/O 查询快,而随机 I/O 慢,所以频繁回表效率很低。
因此,不要因为图方便,在代码里都用 select * ,从而引发不必要的回表操作。
Comments