Skip to content

MySQL 如何避免回表

在sql优化中索引覆盖和避免不必要的回表是提高执行效率的有效手段。

什么是回表

在我们使用索引进行数据查询时,如果查询的字段不在索引的节点数据中,那么就需要通过聚集索引id去聚集索引中再查找一遍完整的数据。一般聚集索引就是主键索引。

例如:我们有一用户表,现在要查询出年龄为18岁的用户。

idnameage
1tom18
2jerry20
3lily16
4jack21

id为主键,在age上建立索引。查询的sql语句如下:

sql
SELECT * FROM user WHERE age = 18;

回表查询

可以看到,先通过age索引进行查询,在B+树的叶子节点,我们获取到的数据为id=1,age=18,由于name我们没有获取到,所以需要通过id再查询一次。这就产生了回表查询,那么我们怎么避免回表查询呢?如果我们只查询id,age,那么我们在第一步就已经完全得到我们需要的数据了,就不会再去通过id查询主键索引了,这样就避免了回表查询。

sql
SELECT id, age FROM user WHERE age = 18;