全局索引与局部索引查询性能

订单表 orders 分区键为 order_date,customer_id 列创建全局唯一索引。
SELECT * FROM orders WHERE customer_id=‘10000111001’;
A ODP 默认按 customer_id 路由到精准分区
B 未指定分区键→ODP 随机选Zone 内节点转发
C 开启全局索引路由可定位目标分区,避免全扫
D 将字段customer_id更改为本地索引,可以提高查询性能。

答案C

我觉得C是对的,对于其它选项,有没有人能详细解析一下
@论坛小助手

选项C是正确的,对于给定的SQL语句 SELECT * FROM orders WHERE customer_id='10000111001'; 来说,如果orders表有一个全局索引且该全局索引是基于customer_id列的,开启全局索引路由可以有效地定位到目标分区,避免了全表扫描,从而提高了查询性能。

对于其他选项的解析如下:

  • 选项A:默认按 customer_id 路由到精准分区。这种说法不准确,因为默认情况下,如果查询没有提供分区键(order_date),ODP(OceanBase Data Proxy)并不能直接路由到具体的分区,而是需要扫描所有分区。
  • 选项B:未指定分区键→ODP 随机选Zone 内节点转发。这种说法也不准确,如果未指定分区键,ODP 会将查询发送到所有分区,而不是随机选择一个节点。
  • 选项D:将字段customer_id更改为本地索引,可以提高查询性能。这种说法不完全正确。虽然局部索引可以提高某些查询的性能,但在没有提供分区键的情况下,局部索引仍然需要扫描所有分区,因此不会显著提高查询性能。此外,如果需要确保customer_id的唯一性,局部索引无法满足这一需求,必须使用全局索引。

具体信息可参考以下文档:

  1. OceanBase 数据库性能的影响因素
  2. 使用 OceanBase 数据库分区表进行水平拆分
  3. OceanBase 数据库在 MySQL 模式租户下的扩展功能
  4. 分区索引
  5. 索引设计