全局索引与局部索引选择

当一个表的数据量极大且是分区表时,创建索引时如何选择是使用全局索引(Global Index)还是局部索引(Local Index)?各自的优缺点是什么?如果我的查询条件常常不带分区键,是不是必须用全局索引?全局索引带来的性能代价有多大?

1 个赞

@论坛小助手

在决定使用全局索引(Global Index)还是局部索引(Local Index)时,应考虑以下几个因素:

局部索引(Local Index)

  1. 优点
    • 维护成本低:局部索引的维护成本较低,因为每个分区上的索引只与该分区的数据有关,因此在插入、更新或删除数据时,只需维护相应的分区索引。
    • 分区裁剪:局部索引可以利用分区裁剪技术,即在查询时只扫描包含所需数据的分区,从而提高查询性能。
    • 减少分布式事务:局部索引的更新通常不会引起跨分区的分布式事务,因此性能较好。
  2. 缺点
    • 唯一性约束:局部索引无法保证全局唯一性,因为每个分区上的索引只保证该分区内的唯一性。
    • 查询限制:如果查询条件不包含分区键,局部索引可能会导致全分区扫描,影响查询性能。

全局索引(Global Index)

  1. 优点
    • 全局唯一性:全局索引可以保证索引键的全局唯一性,适用于需要全局唯一性的场景。
    • 灵活的分区规则:全局索引可以独立定义分区规则,不依赖于主表的分区规则,因此更灵活。
  2. 缺点
    • 维护成本高:全局索引的维护成本较高,因为每次数据更新都可能涉及跨分区的分布式事务,导致性能下降。
    • 分区管理复杂:全局索引的分区管理和维护较为复杂,尤其是在主表分区频繁变化的情况下。
    • 查询性能:如果全局索引的分区规则与主表的分区规则不同,查询时可能需要进行跨分区的 RPC 调用,增加查询延迟。

选择建议

  • 查询条件包含分区键:如果查询条件经常包含分区键,建议使用局部索引,因为局部索引可以充分利用分区裁剪技术,提高查询性能。
  • 查询条件不包含分区键:如果查询条件经常不包含分区键,且需要保证索引键的全局唯一性,建议使用全局索引。但需要注意,全局索引会带来较高的维护成本和查询性能开销。
  • 性能敏感:如果对性能非常敏感,尽量避免使用全局索引,除非业务需求强制要求全局唯一性。

性能代价

  • 写入性能:全局索引在数据写入时可能需要进行跨分区的分布式事务,导致写入性能下降。
  • 查询性能:全局索引在查询时可能需要进行跨分区的 RPC 调用,增加查询延迟。
  • 维护成本:全局索引的维护成本较高,尤其是在主表分区频繁变化的情况下。

综上所述,如果您的查询条件常常不带分区键,且需要保证索引键的全局唯一性,可以考虑使用全局索引。但请务必评估全局索引带来的性能代价,并权衡利弊。如果性能是关键因素,建议尽量使用局部索引,并优化查询条件以包含分区键。

详情请参考:

  1. 分区索引
  2. OceanBase 数据库在 MySQL 模式租户下的扩展功能
  3. 索引概述
  4. OceanBase 数据库性能的影响因素
  5. 索引设计