- 索引覆盖(covering index) 是一种很常用的优化 B+树 搜索次数的手段。即从 非主键索引 中就能查到的记录,减少B+树的搜索次数,避免了 回表(根据主键查询聚簇索引,查找记录),减少随机IO。
- 简单来说,就是所有的查询列都包含在索引中,因此通常为了优化查询速度,我们会为查询列添加上多列索引
示例
ALTER TABLE user ADD INDEX index_name_age(name, age);
SELECT name, age FROM user
SELECT name, age FROM user WHERE name = '张三'
注
- 查询中应该尽量使用索引覆盖,避免 SELECT * FROM ,即使将所有字段加上索引,也会导致索引文件过大,查询性能下降
- 使用索引覆盖必须要存储索引列的值,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做索引覆盖
- 覆盖索引在InnoDB引擎下效果更为显著,InnoDB的二级索引在叶子节点中保存了行的主键值,如果二级索引能够覆盖查询,就避免了对主键索引的二次查询。而MyISAM只有非聚簇索引,不需要回表查询,因此不会有太大效果