大家好,在OceanBase这类分布式数据库中,为了加速查询,我们常会使用全局二级索引。但它也带来了额外的代价:写入数据时,需要同步维护索引表,这可能引入跨机分布式事务。
根据官方资料理解,这个过程可能增加延迟。但在实际应用中,这个代价具体有多大?如何量化评估?
想请教的具体场景和问题:
假设我们有一张按user_id 哈希分区的主表,并为其order_time 字段创建了全局二级索引。
-
性能影响量化 :一次在主表上的
INSERT,相比于无GSI的情况,理论上会增加多少网络往返和事务开销?是否有相关的性能视图(如GV$SQL_AUDIT中的特定等待事件)可以观测到这个维护过程的耗时? - 设计取舍 :在什么业务场景下(例如,读远多于写、或对查询延迟要求极高),值得承担GSI的写入代价?反之,何时应该考虑使用局部索引或调整主表分区键来替代?
- 优化实践 :是否有降低GSI维护成本的实践?例如,将索引表与主表放在相同的Locality中,或者使用特定的优化器提示?
期待各位分享在真实业务中设计和使用GSI的经验、教训以及性能测试数据,帮助我们更好地做出架构决策。
【标签】 #分布式索引 #GSI #数据库设计 #性能优化