oceanbase的索引问题

oceanbase创建的二级分区表,分区键还需要显示创建索引吗?索引执行时是否默认使用分区键?在执行计划中是如何显示算子的?

1 个赞

@论坛小助手

根据文档库中的信息,以下是关于 OceanBase 索引和分区表的相关解答:

1. 分区键是否需要显式创建索引

  • 根据文档信息(参考:分区表设计使用限制),OceanBase 数据库的分区表主键和唯一键不需要单独建索引。这是因为 OceanBase 数据库会自动为主键生成主键索引。
  • 如果是分区表的唯一索引,则局部的唯一索引必须包含表分区的分区键(参考:索引概述)。因此,分区键本身并不需要显式创建索引,但如果是局部唯一索引,则需要显式包含分区键。

2. 索引执行时是否默认使用分区键

  • 在查询时,如果 SQL 带上了拆分键(即分区键),OceanBase 数据库会根据条件进行分区裁剪,只搜索特定的分区(参考:分区表的索引)。
  • 对于全局索引(GLOBAL),由于其覆盖整个分区表的数据,查询时不会直接依赖分区键进行分区裁剪,而是通过索引本身的结构来加速查询。
  • 对于本地索引(LOCAL),查询时会优先利用分区键进行分区裁剪,从而提升查询性能。

3. 执行计划中如何显示算子

  • 在 OceanBase 的执行计划中,分区裁剪的信息通常会以 PARTITION RANGE ITERATOR 或类似的算子形式显示。具体来说:
    • 如果查询条件中包含了分区键,并且能够触发分区裁剪,则执行计划中会明确显示哪些分区被访问。
    • 如果没有使用分区键,或者查询条件无法触发分区裁剪,则可能会显示全表扫描或全分区扫描的算子。
  • 示例执行计划片段可能如下:
    EXPLAIN SELECT * FROM t_log_part_by_range_hash WHERE log_date = '2023-01-01';
    +---------------------------------------------+
    | ID  | OPERATION                          | NAME |
    +---------------------------------------------+
    |   1 | PARTITION RANGE ITERATOR          | p1   |
    |   2 |    TABLE ACCESS BY LOCAL INDEX ROWID| t_log_part_by_range_hash |
    +---------------------------------------------+
    
    上述示例中,PARTITION RANGE ITERATOR 显示了分区裁剪的结果,仅访问了符合条件的分区 p1

总结

  • 分区键本身不需要显式创建索引,但局部唯一索引需要显式包含分区键。
  • 查询时,默认会利用分区键进行分区裁剪,前提是查询条件中包含分区键。
  • 执行计划中,分区裁剪的结果会以 PARTITION RANGE ITERATOR 等算子形式显示。

如果您需要更详细的执行计划分析,可以结合实际的 SQL 查询和 EXPLAIN 语句进一步观察。

详情请参考:

  1. 索引概述
  2. 使用 OceanBase 数据库分区表进行水平拆分
  3. 分区表设计
  4. 分区概述
  5. 创建索引
  6. 分区键
1 个赞

不需要显示创建

好详细