索引覆盖

Exisi 2023-04-13 19:24:30
Categories: Tags:
  • 索引覆盖(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只有非聚簇索引,不需要回表查询,因此不会有太大效果

 

 

来自 <https://zhuanlan.zhihu.com/p/481750465>