MySQL - 覆盖索引、回表查询
覆盖索引 :
- 覆盖索引是指一个索引包含了查询所需的所有列,而不需要进一步的访问主表。这意味着查询可以从索引本身中获取所有需要的数据,而不必访问主表的行记录。
- 覆盖索引通常用于提高查询性能,因为它减少了I/O操作,降低了查询的成本。当查询可以完全依赖于索引,而无需回到主表获取数据时,就发生了覆盖索引。
回表查询 :
- 回表查询是当某个查询无法从索引中获取所需的所有列数据,必须通过索引中的键值(通常是主键值)到主表中进行进一步查找的情况。
- 通常,回表查询发生在普通索引中,因为普通索引的叶子节点只包含索引列的值和主键值,而不包含其他列的数据。当查询需要获取主表中的其他列时,数据库引擎会执行额外的查找操作,这个过程被称为回表。
在InnoDB存储引擎中,聚簇索引是特殊类型的索引,它的叶子节点存储整个行记录而不仅仅是索引列的值。只有一个聚簇索引,它通常是主键索引,因为主键是唯一标识一行记录的。在这种情况下,如果查询可以利用主键索引获取所有所需数据,就可以实现覆盖索引。否则,如果需要从主表中获取其他列数据,就会发生回表查询。
总结,覆盖索引是一种性能优化技术,允许查询从索引中获取所有需要的数据,而不需要回表到主表。回表查询则是当索引无法提供全部数据时,必须回到主表查找其他列数据的操作。聚簇索引通常用于实现覆盖索引,而普通索引通常导致回表查询。
还没有评论,来说两句吧...