2026-06-16 07:48:34
使用覆盖索引的主要原因是减少树的搜索次数,避免回表操作,从而显著提升查询性能。
主键索引(聚簇索引):叶子节点存储完整的行数据。
非主键索引(普通索引):叶子节点仅存储主键值,不直接包含完整数据。

回表操作的性能损耗当查询使用非主键索引时,若需获取索引未覆盖的字段,需通过以下步骤:
在非主键索引树中定位主键值。
根据主键值回表到主键索引树中查询完整数据。例如,执行SELECT * FROM user WHERE age=3时:
先在age索引树中找到id=300。
再到id索引树中查询id=300的完整行数据。回表导致额外I/O操作,降低查询效率。
覆盖索引的优化原理覆盖索引通过索引本身直接满足查询需求,无需回表。例如,执行SELECT id FROM user WHERE age=3时:
age索引树的叶子节点已包含id字段,可直接返回结果。
省去了回表步骤,减少一次B+树搜索,显著提升性能。
覆盖索引的适用场景
查询字段被索引完全覆盖:如SELECT a, b FROM table WHERE a=1,若(a,b)为联合索引,则无需回表。
避免SELECT *:仅查询索引包含的字段,减少数据传输量。
减少随机I/O:回表操作可能导致磁盘随机读取,覆盖索引通过顺序访问索引树优化性能。
总结覆盖索引通过消除回表操作,将查询过程从“两次B+树搜索”简化为“一次索引扫描”,尤其在高并发或大数据量场景下,性能提升效果显著。因此,它是MySQL索引优化的核心手段之一。