什么是回表?回表是指 MySQL 优化器使用了覆盖索引来满足一个查询时,但查询的需要的所有字段都不在该索引中,因此,MySQL 需要再次回到这个对应的数据表中查找这些字段,这个过程就称为回表。
例如,如果大家执行以下语句:
SELECT name, age FROM users WHERE id = 100;
如果表 users 中有一个适合的索引,那么 MySQL 可能会决定使用覆盖索引来避免通过回表操作来获取数据。所谓覆盖索引就是指索引中的所有数据都能满足查询的条件和查询所需要的字段。
然而,大家的查询语句并不只是需要 id 字段,还需要姓名和年龄。因此,MySQL 需要回到 users 表中,查找 id 为 100 的用户,并返回他们的姓名和年龄。
回表的代价往往比直接从索引中获取数据的代价更高,因为 MySQL 必须访问并读取更多的数据块(block)来恢复需要的列。这也是为什么大家在设计数据库时应该尽可能使用含有所有需要查询列的索引。除此之外,限制查询所需要返回的行和列的数量,以降低查询操作的成本也是一个不错的决策。