MySQL 覆盖索引:原理、优势与适用场景
在 MySQL 中,如果一个索引包含了查询所需的所有字段值,我们就称之为'覆盖索引'。通俗点说,就是查询的数据列完全可以从索引树中直接获取,根本不需要再去数据表中回表查找。
为什么它能提升性能
这种机制带来的性能提升是显而易见的,主要体现在以下几个方面:
- 减少 IO 访问量:索引条目通常远小于数据行大小,只需读取索引即可满足查询需求。
- 降低随机 IO:索引按列值顺序存储,范围查找时的顺序 IO 远少于从磁盘随机读取每一行数据的开销。
- 引擎缓存差异:例如 MyISAM 仅在内存中缓存索引,访问数据依赖操作系统缓存;而 InnoDB 的二级索引叶子节点保存了主键值,若查询能覆盖,则避免了二次查询主键索引。
适用场景与限制
需要注意的是,并非所有索引类型都支持覆盖索引。只有 B-tree 索引能够存储索引列的值,因此 MySQL 只能用 B-tree 索引做覆盖索引。哈希索引、空间索引和全文索引由于不存储列值,无法实现这一特性。
简单来说,当建立索引的字段正好覆盖了查询语句 SELECT 子句与 WHERE 子句中涉及的所有字段时,就能触发覆盖索引优化,让查询效率更上一层楼。

