面试官提问

● 什么是索引覆盖?

所谓索引覆盖是指SQL查询时只需在一棵索引树上就能获取所需的列数据,无须二次回表查询。

假设表有四个字段idcol1col2col3

建立的联合索引如下:

     ALTER TABLE `tableNmae` ADD INDEX `idx_col1_col2`(`col1`,`col2`);
     SQL1:SELECT * FROM tableNmae WHERE col1 = xxx ORDER BY col2;
     SQL2:SELECT col1, col2 FROM tableNmae WHERE col1 = xxx ORDER BY col2;

SQL1由于select *需要查询所有的列,col3在联合索引上是缺失的,因此只能在联合索引中检索出符合条件的主键id,然后二次回表查询出所有数据列。

SQL2在联合索引上即可检索出匹配的数据并返回,无须二次回表查询,这种查询就是索引覆盖。