OceanBase索引问题

OceanBase 本地索引和全局索引在分区表上的使用差异是什么?什么业务场景下建议优先使用全局索引,会带来哪些性能与存储开销?

1 个赞

@论坛小助手

OceanBase 本地索引和全局索引在分区表上的使用差异

根据文档库中的信息,OceanBase 本地索引和全局索引在分区表上的主要区别如下:

  • 本地索引

    • 和主表的最小子分区绑定在一起。
    • 不会在系统租户中创建额外的分区记录。
    • 所有基于本地索引的 SQL 基本都是本地执行,不会涉及跨节点操作。
    • 分区策略与主表保持一致,每个索引分区覆盖相应的主表分区。
  • 全局索引

    • 在系统租户中创建额外的一个分区记录,可以理解为另外一张表。
    • 占用额外的分区配额。
    • 可以有自己的独立分区策略,不一定与主表相同。
    • 即使是单表,全局索引也可以与主表分别存储在不同的节点上。
    • 容易导致 SQL 成为分布式 SQL,因为可能需要跨节点进行数据访问。

业务场景下建议优先使用全局索引的情况

推荐使用全局索引的业务场景包括但不限于以下几种情况:

  • 满足全局唯一性约束:如果业务上有除了主键外其他列组合需要满足全局唯一性的强需求,并且这些组合不包含分区键时,只能通过全局索引来实现这种唯一性约束。例如,当某业务字段要求全局唯一但又不能作为主键或唯一索引的一部分来定义(因为它不是分区键)时,应考虑使用全局索引。

  • 无法获取分区键条件:当业务查询无法得到分区键的条件谓词,且业务表没有高并发同时写入的情况下,为了提高查询效率,可以通过构建全局索引来避免全分区扫描。此时,可以根据查询条件创建全局索引,并按新的分区键对其进行分区,从而加速特定条件下的数据检索过程。

  • 多维度查询支持:对于某些业务需求,可能需要根据不同的维度来进行数据查询。如果这些维度并不完全对应于现有的分区方案,则通过设置合适的全局索引可以帮助更高效地完成此类查询任务。

全局索引带来的性能与存储开销

  • 性能影响

    • 每笔数据写入都可能变成跨机的分布式事务,在高并发写入场景下会影响系统的写入性能。
    • 由于索引数据分布可能与主表不同,这会导致读取过程中产生更多的RPC调用,进而增加了网络延迟。
  • 存储成本

    • 创建了额外的一套分区记录,意味着需要消耗更多空间用于存储这些索引结构。
    • 对于大型表来说,全局索引可能会显著增加总体的数据存储需求。

总的来说,在选择是否使用全局索引时需权衡其带来的优势与潜在的成本。除非确实存在上述特殊需求,否则一般建议尽量采用局部索引来优化整体系统性能。参考资料来自集群管理 FAQ → 存储 FAQ → 在 OceanBase 数据库中,局部索引与全局索引在实现上的区别是什么?OceanBase 数据库性能的影响因素 → 资源分配 → 局部索引和全局索引 → 全局索引等章节。

更多信息请查看:

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