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

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

本文内容来自 YashanDB 官网,原文内容请见https://yashandb.com/newsinfo/7849027.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 做优化提升写入性能。

目录
打赏
0
2
2
0
98
分享
相关文章
【YashanDB知识库】Kettle迁移PostgreSQL到YashanDB
本文介绍了在Windows环境下使用开源工具Kettle将PostgreSQL数据迁移到YashanDB的方法,适用于YMP不支持PostgreSQL的场景。环境配置包括Kettle 8.3、JAVA 1.8、PostgreSQL 12和YashanDB 23.2.1.100。通过设置JAVA环境变量、解压作业包、启动Kettle图形界面,配置数据库连接(PostgreSQLInput与YashanOutput)以及修改表清单文件等步骤,最终执行总任务完成数据迁移。若迁移失败,可通过日志定位问题并重试,目标表会在每次同步前被truncate以避免数据冲突。
【YashanDB知识库】Kettle迁移PostgreSQL到YashanDB
【YashanDB知识库】DataX迁移Hive到崖山分布式
本文来自YashanDB官网,介绍通过DataX将Hive数据迁移到YashanDB的实现方法。源环境为Hive 3.1.3,目标为YashanDB 23.2.3.100。文章提供了Hive与YashanDB的建表脚本、数据类型映射及DataX配置示例,包含reader和writer插件参数设置,并通过`datax.py`执行同步任务。内容详尽展示了数据迁移的全流程。
【YashanDB知识库】DataX迁移Hive到崖山分布式
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
本文介绍通过Flink CDC实现Oracle数据实时同步至崖山数据库(YashanDB)的方法,支持全量与增量同步,并涵盖新增、修改和删除的DML操作。内容包括环境准备(如JDK、Flink版本等)、Oracle日志归档启用、用户权限配置、增量日志记录设置、元数据迁移、Flink安装与配置、生成Flink SQL文件、Streampark部署,以及创建和启动实时同步任务的具体步骤。适合需要跨数据库实时同步方案的技术人员参考。
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
【YashanDB知识库】Kettle迁移MySQL到YashanDB
本文介绍了使用Kettle将MySQL数据库中的中文数据迁移到YashanDB的方法,解决因YMP不支持Latin1字符集导致的乱码问题。提供了Windows和Linux两种环境下的操作步骤,包括配置JAVA环境、解压作业包、设置数据库连接(MySQLInput与YashanOutput)、修改表列表配置文件及运行迁移任务。Windows环境支持图形界面便于调试,Linux环境网络性能更优。通过详细的操作指南,确保数据迁移成功并可重试无冲突。
【YashanDB 知识库】DolphinScheduler 适配崖山 Python 驱动
本文来自YashanDB官网,介绍如何将DolphinScheduler调度器适配崖山Python驱动,实现通过Python任务访问崖山数据库。环境要求包括DolphinScheduler 3.1.9、Python 3.9及YashanDB 23.2.2.100。操作步骤涵盖安装YashanDB客户端、配置环境变量、安装Python驱动以及设置DolphinScheduler相关参数,助力用户高效集成与使用。
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
本文介绍了YashanDB在特定场景下的问题分析与解决方法。当使用yasboot重启数据库后,yasom和yasagent进程虽启动成功但出现告警,原因是缺少libnsl.so.1库文件或环境变量配置错误。解决步骤包括:检查系统中是否存在该库文件,若不存在则根据操作系统类型安装(有外网时通过yum或apt,无外网时创建符号链接),若存在则调整环境变量配置,并重新启动相关进程验证问题是否解决。
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
本文介绍了MySQL中`CONTINUE HANDLER FOR NOT FOUND`的用法及其在YashanDB中的改写方法。通过一个示例存储过程,展示了如何使用游标和异常处理机制来应对“未找到数据”的情况。在MySQL中,`CONTINUE HANDLER`用于捕获此类异常;而在YashanDB中,则需改用游标的`%NOTFOUND`属性和`NO_DATA_FOUND`异常处理。文章对比了两者的执行效果,帮助用户顺利完成从MySQL到YashanDB的业务迁移。
【YashanDB知识库】共享超过32000字节字符串插入CLOB类型方案
本文来自YashanDB官网,介绍了解决向崖山数据库CLOB类型字段插入超过32000字节字符串时出现的YAS-04107错误的方法。通过JDBC动态变量绑定技术,实现对不同表的超长字符串插入支持。方案基于YashanDB JDBC和Druid组件,动态解析SQL语句并绑定变量,提供通用性。文章包含关键代码示例及程序使用说明,需JDK 1.8环境运行,并提供附件下载以辅助实施。
【YashanDB知识库】扩展redo大小
本文介绍了崖山数据库(YashanDB)中调整redo文件数量和大小的方法。通过修改配置文件的REDO_FILE_NUM和REDO_FILE_SIZE参数,或使用SQL命令手动扩容redo文件,具体包括:查看当前redo状态、新增redo文件、切换日志写入、执行检查点操作以确保数据安全、删除旧redo文件等步骤。此方法适用于安装后发现redo配置过小的情况,帮助优化数据库性能。
【YashanDB知识库】MySQL和YashanDB 隐式转换不一致引起的报错
本文分析了在YashanDB中执行特定SQL语句时出现的类型转换错误问题,并对比了YashanDB、Oracle和MySQL 5.7的行为差异。问题源于隐式类型转换,当数值字段与非法数字字符串(如'1,2')进行比较时,YashanDB和Oracle会报错,而MySQL 5.7虽不报错但会引发警告。通过调整SQL语句,避免数值与字符串直接比较,可有效解决问题。文章还详细解析了不同值表现不一致的原因,涉及执行计划和过滤条件的实际运行细节。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等