关于回表的问题

oceanbase数据库在命中索引的前提下,哪些情况需要回表,哪些情况下不需要回表,有没有大神帮忙解答婴一下?

@论坛小助手

在 OceanBase 数据库中,是否需要回表取决于查询所需的列是否完全包含在索引中。

  • 不需要回表的情况

    • 如果查询所需的列完全包含在索引中,那么查询可以直接通过索引获取所需数据,而不需要回表。例如,查询 Q1 中的 SELECT b, c FROM test WHERE (b = 1 OR b = 2) AND (c = 1 OR c = 2); 命中了唯一性索引 uk1,并且查询所需的列 bc 都在索引 uk1 中,因此不需要回表。
  • 需要回表的情况

    • 如果查询所需的列不完全包含在索引中,则需要回表。例如,查询 Q2 中的 SELECT * FROM test WHERE (c = 1 OR c = 2) AND (d = 1 OR d = 2); 命中了唯一性索引 uk2,但查询所需的列不仅包括索引 uk2 中的 cd,还包括其他列,因此需要回表。

具体示例如下:

obclient> CREATE TABLE  test(a INT PRIMARY KEY, b INT, c INT, d INT, e INT,
UNIQUE KEY UK1(b,c), UNIQUE KEY UK2(c,d) );
Query OK, 0 rows affected

Q1:
obclient> SELECT b,c FROM test WHERE (b = 1 OR b = 2) AND (c = 1 OR c =2);

Q2:
obclient> SELECT * FROM test WHERE (c = 1 OR c =2) AND (d = 1 OR d = 2);

总结:

  • 不需要回表:查询所需的列完全包含在索引中。
  • 需要回表:查询所需的列不完全包含在索引中。

更多信息请查看:

  1. 基于规则的路径选择
1 个赞

简单来说,能从索引中找到所有数据就不回表,如果有些字段索引不包含就得回表了。

1 个赞