在SQL执行流程中从非主键索引树搜索回到主键索引树搜索的过程称为:回表

在本次查询中因为查询结果只存在主键索引树中,我们必须回表才能查询到结果,那么如何优化这个过程呢?下面引入覆盖索引。

覆盖索引(covering index ,或称为索引覆盖)即从非主键索引中就能查到的记录而不需要查询主键索引中的记录避免了回表的产生,减少了树的搜索次数,显著提升性能。

使用

建立表student,id为主键索引,name为普通索引。

img

那么现在出现的业务需求中要求根据名称获取学生的年龄,并且该搜索场景非常频繁,那么先删除之前以字段name建立的普通索引,以nameage两个字段建立联合索引,SQL命令与建立后的索引树结构如下:

1
2
ALTER TABLE student DROP INDEX I_name;
ALTER TABLE student ADD INDEX I_name_age(name, age);

执行如下SQL:

1
SELECT age FROM student WHERE name = '小李';

流程为:

  1. name,age联合索引树上找到名称为小李的节点
  2. 此时节点索引里包含信息age 直接返回 12