回表,覆盖索引和索引下推
回表
回表:使用非聚簇索引(二级索引)进行查询的时候,因为二级索引里只存储了索引字段的值和对应的主键值,如果需要查询数据行中的其他数据,就需要根据主键去聚簇索引中查找实际的数据行。
回表操作主要步骤:
- 根据二级索引找到符合条件的记录的主键值
- 根据主键值回到聚簇索引中查找到整行的数据
回表的问题:
回表会带来潜在的性能问题,因为它增加额外的随机I/O开销,每次回表都需要访问两次索引,一次是通过二级索引定位到主键,另一次是通过主键再聚簇索引中找到实际的数据行。这再高并发、大数据量的情况下,可能会出现性能瓶颈。
为了避免回表查询,可以使用覆盖索引,即一个索引包含所有需要查询字段的值,这样查询据可以通过二级索引本身得到所需的数据,而不需要回表到主键索引。
覆盖索引(Covering Index)
覆盖索引是指一个索引包含了所有需要查询字段的值,这样数据库引擎就不需要回表就能完成查询。覆盖索引可以减少I/O操作。
索引下推(Index Pushdown)
索引下推是一种优化策略,用于减少从表中读取到的行数,在这种机制下,数据库引擎可以在使用索引时,将一些过滤条件下推到索引扫描的过程中,这样可以更早地排除不符合条件的行,减少需要返回到上层的数据。索引下推特别适合使用联合索引进行查询优化的场景。
索引下推的目的时为了减少回表次数,也就是减少I/O操作。对于InnoDB的聚簇索引来说,数据和索引是在一起的,不存在回表
回表,覆盖索引和索引下推
https://blog.mufen.site/2024/12/21/回表,覆盖索引和索引下推/