索引覆盖其实就是在索引树上就可以满足查找时的需求而无需后续操作例如:二级索引中的回表操作,我们在将这样一种检索时发生的操作称为索引覆盖,索引覆盖对所有索引树都适用。
索引覆盖的例子:
例如我们现在有一个表table1它的某列为:id
1.select * from table1 where id = 1
2.select id from table1 where id = 1
上述的两条sql语句很相近但是因为检索字段的不同会导致1中的sql语句无法使用到索引覆盖的操作。这点在explain中extra中有很好的体现例如2中的sql语句在explain中extra列中会显示using index这样就是使用到了索引覆盖。之所以2会用到索引覆盖是因为在索引树中搜索的时候在叶子节点中就可以找到相应的数据而无需其它操作例如联合索引的回表操作,所以这样效率更高。
联合索引的有点有哪些有点?
1.无需回表操作,减少二次查找时的随机IO的开销
2.减少遍历数据页的数量,因为索引树中叶子节点占用的数据页的数量肯定是要比原表的数量少的或者说是二级索引的索引树的叶子结点的数量小于聚簇索引的索引树。