概念
如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),即不需要回表操作
判断sql是否使用了覆盖索引
我们可以通过expalin来判断查询是否覆盖索引,主要看extra字段是否有 using index 。
覆盖索引的优势
使用覆盖索引的点在于其不用回表操作,不需要回表操作有哪些优势呢?
- 索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。
- 因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。
- 一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用
- innodb的聚簇索引,覆盖索引对innodb表特别有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询)
覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引