从MySQL迁到OceanBase后,很多同学喜欢给非分区键建全局索引来加速查询。但如果不了解全局索引的“脾气”,可能适得其反。
全局索引的核心原理 :它相当于一张独立的索引表,按索引键分区,存储着指向主表数据的指针。当你的查询条件命中全局索引时,OB会先扫索引分区定位数据位置,再跨分区抓取数据。
几个实战要点:
-
索引分区键要与查询条件匹配
如果索引按order_date分区,但查询只有user_id条件,索引帮不上忙。 -
避免在频繁更新的列上建全局索引
每次更新索引列都会触发跨分区事务,写入放大明显。 -
警惕“索引热点”
所有查询都集中在最近时间分区,会导致该分区成为瓶颈。 - 覆盖索引能大幅提升性能
sql
CREATE GLOBAL INDEX idx_covering ON orders(order_date, user_id, amount) INCLUDE (order_id); – 避免回表
性能对比例子 :查询WHERE order_date BETWEEN ? AND ? ,无索引2.3秒,只有本地索引1.8秒,全局索引0.15秒。
一句话总结 :全局索引是跨分区查询的利器,但设计时要考虑写入代价和访问模式。
【标签】 #全局索引 #分区设计 #性能优化 #索引设计