全局二级索引-GSI

场景 #

[Claude] 分布式数据库的全局二级索引主要有以下几个使用场景: 加速多表关联查询:用全局二级索引构建外键索引,可以有效地加速涉及多表关联的查询。 全表扫描查询:当需要做全表扫描时,使用全局二级索引可以跳过不需要的行,大幅降低扫描成本。 频繁查询的列上:对于数据库中经常需要根据某列进行查询的情况,建立该列的全局二级索引,可以大幅提高查询效率。 需要排序的查询:当需要查询结果按某个列排序时,全局二级索引可以加速排序。 模糊查询优化:通过部分键值匹配,全局二级索引可以优化like查询等模式查询。 分页查询优化:结合 Cursor 标记,全局二级索引可以有效的支持分页查询。

总的来说,对于需要高效查询、排序、混合查询等复杂查询的分布式数据库而言,引入全局二级索引可以大大提高性能。尤其是处理大规模数据时,二级索引发挥的作用更加明显。

  • 全局二级索引能够解决什么问题 [1] 如果查询的维度与逻辑表的拆分维度不同,会产生跨分片查询。跨分片查询的增加会导致查询卡慢、连接池耗尽等性能问题。GSI能够通过增加拆分维度来减少跨分片查询,消除性能瓶颈

  • 增加拆分维度 [4] 例如,对于在线商城的订单表,假设按照买家用户维度拆分,那么对于卖家查询(例如,查询某个卖家的本月所有订单)就需要扫描所有分区。但是借助全局二级索引,可以仅仅扫描相应卖家所在的索引表分区,快速找到所需的订单信息。

  • 全局唯一约束 [4] 例如,假设用户表是一张分布式表,按照用户ID分区。若要求用户手机号需要全局唯一,那么本地索引无法满足,必须构建一个按手机号作为索引键(同时也是分区键)的唯一索引。

全局索引 vs 局部索引 [1][2] #

  • 全局二级索引 [DDIA 基于关键词的二级索引分区] 数据行和对应的索引行保存在不同分片上

    • 分类 [3]
      • 全局非分区索引(Global Non-Partitioned Index)
      • 全局分区索引(Global Partitioned Index)
  • 局部索引 [DDIA 基于文档的二级索引分区] 如果数据行和对应的索引行保存在相同分片上

PolarDB 全局索引 #

  • PolarDB-X [1]

    • XA多写,保证主表与索引表数据强一致。[性能会不会慢]
    • Online Schema Change,添加GSI不锁主表。
  • PolarDB-X GSI [4] 每个GSI对应一张分布式索引表,和其他分布式表一样,按照指定的分区规则水平拆分为多张物理表。PolarDB-X使用分布式事务维护主表和索引表之间数据强一致。

参考 #

  1. 全局二级索引 PolarDB
  2. 设计数据密集型应用-C6-分区和二级索引 DDIA
  3. 二级索引 OB
  4. 全局二级索引 PolarDB
  5. PolarDB-X 全局二级索引
  6. PolarDB-X 数据分布解读(三) :TPCC与透明分布式