跳至主要內容

什么是Mysql的回表?

fangzhipeng约 578 字大约 2 分钟

什么是Mysql的回表

在MySQL中,回表(也称为回表查询或回到数据页查询)是指当使用索引来执行查询时,虽然索引可以帮助快速定位到符合条件的行,但是为了获取完整的查询结果,仍然需要回到原始数据页(或称为聚簇索引)中检索所需的数据。

回表就是在使用索引的情况下,仍然需要额外的IO操作来获取索引以外的其他列的数据。

通常情况下,当查询的条件列包含在索引中,并且查询只需要索引列时,MySQL可以直接从索引中获取所需的数据,无需回表。

示例

在innodb的存储引擎的MySQL数据库中,创建一张包含(id, username, age)列的表,其中id列是主键,username列是普通索引。

  1. 当执行查询以下Sql语句时,MySQL会使用username索引定位到符合条件的行的地址。
SELECT id, username, age FROM table WHERE username = 'forezp';
  1. 然后,MySQL需要回到原始数据页(或聚簇索引)中获取id、age列的值,因为这两列不在索引中,这就是回表操作。

示意图如下:

+------------------------------------------------+
|                索引(username)                       |
+------------------------------------------------+
| username = forezp | 指针(指向聚簇索引)                |
+------------------------------------------------+

+------------------------------------------------+
|               聚簇索引                           |
+------------------------------------------------+
| id | username | age |
+------------------------------------------------+
| 123| forezp   | 25  |
+------------------------------------------------+

回表操作增加了额外的IO开销和查询时间,如果能够避免,应尽量避免。

怎么避免

要避免回表操作,可以考虑以下几种方法:

覆盖索引

  • 使用覆盖索引,即创建一个包含所有查询所需列的复合索引。这样,在执行查询时,MySQL可以直接从索引中获取所有需要的列,而无需回表。
  • 例如,如果查询需要的列是(id, username, age),则创建一个包含这三列的索引。

使用合适的索引

  • 确保查询的条件列和需要检索的列都被索引覆盖。如果查询中的列没有适当的索引,MySQL会回表操作来获取缺失的数据。
  • 分析查询的条件和列,创建合适的索引来覆盖查询的需求。
方志朋_官方公众号
方志朋_官方公众号