面试官提问
● 什么是索引覆盖?
所谓索引覆盖是指SQL查询时只需在一棵索引树上就能获取所需的列数据,无须二次回表查询。
假设表有四个字段id
、col1
、col2
、col3
。
建立的联合索引如下:
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在联合索引上即可检索出匹配的数据并返回,无须二次回表查询,这种查询就是索引覆盖。