覆盖索引

大家通常都会根据查询的 WHERE 条件来创建合适的索引,不过这只是索引优化的一个方面。设计优秀的索引应该考虑到整个查询,而不单是 WHERE 条件部分。如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为覆盖索引。需要注意的是,只有 B-tree 索引可以用于覆盖索引。

覆盖索引是非常有用的工具,能够极大地提高性能:

  • 索引条目通常远小于数据行大小,所以如果只需要读取索引,那么 MySQL 就会极大地减少数据访问量。

  • 因为索引是按照列值的顺序存储的(至少在单页内如此),所以对于 I/O 密集型的范围查询会比随机从磁盘读取每一行数据的 I/O 要少得多。可以通过 OPTIMIZE 命令使得索引完全实现顺序排列,这让简单的范围查询能使用完全顺序的索引访问。

  • 由于 InnoDB 的聚簇索引的特点,覆盖索引对 InnoDB 表特别有用。InnoDB 的二级索引在叶子节点中保存了记录的主键值,所以如果二级索引能够覆盖查询,则可以避免对主键索引的二次查询

最后更新于