什么是MySQL中的覆盖索引?

28 阅读2分钟

在讲解覆盖索引之前,我们先来认识一下什么是聚集索引(主键索引)和辅助索引(二级索引)。

聚集索引(主键索引):主键索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的记录数据(完整的行记录数据)。

辅助索引(二级索引):非主键索引,叶子节点中存放的是主键字段值+索引字段值。

1.什么是覆盖索引?

那么什么是覆盖索引呢?覆盖索引其实不是一种独立的索引类型,而是一种查询优化的方式。覆盖索引就是我们sql中查询的列只需要从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引给覆盖。当能通过索引就可以读取想要的数据,那就不需要再到数据表中读取行了,如果一个索引中包含了满足查询语句中字段与条件的数据,直接从索引中返回结果,无需回表,这个就叫做覆盖索引。

当你的sql使用到索引覆盖时,在explain中的Extra列可以看到“Using index”的信息:

image-20250922085130150.png

从执行结果上看,这个sql语句只通过索引,就取到了所需要的数据,这个过程就叫做索引覆盖。

2.索引覆盖的优点

2.1 减少IO操作

覆盖索引可以避免回表操作,大幅减少磁盘IO,从而可以提升查询性能。

2.2 提升查询速度

数据库只需要在索引中查找即可返回结果,速度更快。

2.3 减少锁争用

因为查询过程中避免访问表数据,可能会减少表级锁或行锁的争用。

3.总结

覆盖索引通过将查询所需要的字段直接存储在索引中,避免了回表操作,大幅提升查询性能。适用于查询字段少、读多写少的场景。