【YashanDB知识库】使用Reverse索引的解决自增序列做索引,插入性能大幅提升

本文来自YashanDB官网:https://yashandb.com/newsinfo/7849028.html?templateId=1718516

问题现象
测试中使用自增序列做索引, 在插入数据的过程速度比较慢, 核查关键等待事件是index block split,time_waited耗时比其他事件高一个量级

问题的风险及影响
影响业务性能

问题影响的版本
YashanDB版本:23.2.9.100

问题发生原因
1、索引结构
数据库领域索引的数据结构从简单的二叉树演变为更复杂的B+树,已解决数据不均匀、大量增加删除导致数据倾斜,查询性能下降等问题。
相关概念可参考 Binary Search Tree Visualization (usfca.edu
也可参考YashanDB官网说明:[索引 | YashanDB Doc]

2、自增序列做索引存在的问题
B+树在索引数据块慢的情况下,需要分裂成2个块,分裂的过程,写入请求需要等待。那么如果是插入的数据使用自增序列做索引,写入的数据按顺序,都在同个索引数据块上,所有请求都需要一起等待block拆分完成。而如果数据是分散的,那么所有的block可能同时都会有数据写入。一个block的拆分阻塞的请求就不会是全部,而是极小一部分。
自增序列插入的过程,图形化展示可以在这里体验:B+ Tree Visualization (usfca.edu)
3、解决办法及验证
业界:
针对该问题,业界通用的做法是将自增序列打散,oracle使用Reverse关键字,IBM使用Radmon关键字( www.ibm.com )
崖山和Oracle保持一致,使用reverse关键字:

原理:
数字Reverse之后,如1234变成4321,1235变成5321,1241则变成1421,数字分散了。M区块满了之后,分裂出N块,同时M还会分裂出L块,一直重复下去,由于数组分散,所有块都有可能插入数据,并发做分裂之后插入,等待事件数量减少,性能因此提高。
实际验证结果:
不使用reverse索引:

使用reverse索引:

结论:
可以看出使用reverse索引,性能提升约6倍,非常明显。在使用自增number、int等做索引,或其他char/varchar等存在单调递增的数值列做索引,均可以使用reverse做优化提升写入性能。

posted @   YashanDB  阅读(5)  评论(0编辑  收藏  举报
编辑推荐:
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
点击右上角即可分享
微信分享提示