oceanbase数据库在命中索引的前提下,哪些情况需要回表,哪些情况下不需要回表,有没有大神帮忙解答婴一下?
在 OceanBase 数据库中,是否需要回表取决于查询所需的列是否完全包含在索引中。
-
不需要回表的情况:
- 如果查询所需的列完全包含在索引中,那么查询可以直接通过索引获取所需数据,而不需要回表。例如,查询 Q1 中的
SELECT b, c FROM test WHERE (b = 1 OR b = 2) AND (c = 1 OR c = 2);
命中了唯一性索引uk1
,并且查询所需的列b
和c
都在索引uk1
中,因此不需要回表。
- 如果查询所需的列完全包含在索引中,那么查询可以直接通过索引获取所需数据,而不需要回表。例如,查询 Q1 中的
-
需要回表的情况:
- 如果查询所需的列不完全包含在索引中,则需要回表。例如,查询 Q2 中的
SELECT * FROM test WHERE (c = 1 OR c = 2) AND (d = 1 OR d = 2);
命中了唯一性索引uk2
,但查询所需的列不仅包括索引uk2
中的c
和d
,还包括其他列,因此需要回表。
- 如果查询所需的列不完全包含在索引中,则需要回表。例如,查询 Q2 中的
具体示例如下:
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 个赞