一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于两层ART树的数据存储方法与流程

2021-11-09 22:16:00 来源:中国专利 TAG:

一种基于两层art树的数据存储方法
技术领域
1.本发明涉及数据存储结构技术领域,特别涉及一种基于两层art树的数据存储方法。


背景技术:

2.art(adaptive radix tree,自适应基数/前缀树)是以二进制位串为关键字的前缀树,是一种多叉树形结构,同时又类似多层索引表,每个中间节点包含指向多个子节点的指针数组,叶子节点包含指向实际的对象的指针。
3.存储引擎是数据库底层软件组织,数据库管理系统(dbms)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。
4.内存中数据的索引结构是影响存储引擎性能的重要因素。art树在所有的索引结构中,查询性能最优。但是,索引结构普遍存在一个问题,随着索引的数据量增大,查询性能会降低。根据论文《the adaptive radix tree:artful indexing for main

memory databases》中记载的测试结果,当数据量从64k提升到16m时,art树的查询性能降低了至少4倍,这种现象严重影响到了存储引擎的性能。
5.针对索引结构查询性能随着数据量增大而大幅降低现象,本发明提出了一种基于两层art树的数据存储方法。


技术实现要素:

6.本发明为了弥补现有技术的缺陷,提供了一种简单高效的基于两层art树的数据存储方法。
7.本发明是通过如下技术方案实现的:
8.一种基于两层art树的数据存储方法,其特征在于:按key值范围分区的方式拆分数据,使用两级art树索引结构,第一级art索引用于key值范围分区,第二级art索引用于索引范围分区内的数据;
9.所述范围分区内的数据集是真实的数据集或数据的指针形成的数据集。
10.包括以下步骤:
11.第一步,数据库存储引擎刚启动时,创建第一个范围分区,其存储key值的范围为(min,max),并且使用该范围分区最大值max作为key值,将范围分区挂载到第一层art树上,
12.第二步,将待插入的数据挂载到范围分区的第二层art树上,启动待拆分队列处理线程作为后台线程,异步优化索引结构。
13.所述第二步中,设置作为全局参数range_area_max_kvs,即范围分区最大数据量阈值;当某个范围分区数据量超过范围分区最大数据量阈值时,将该范围分区拆解成两个。
14.所述第二步中,数据插入流程如下:
15.s1:查询第一层的art树,找到大于等于待插入的key值对应的范围分区,存入变量
currangearea中;
16.s2:判断范围分区currangearea的状态,如果状态为“待删除”,则返回s1;
17.s3:将待插入的数据挂载到范围分区currangearea的第二层art树上;
18.s4:判断范围分区currangearea的状态,如果状态为“正在拆分”,则将数据放入该范围分区currangearea的增量数据队列中,结束并退出,否则跳转到s5;
19.s5:判断范围分区currangearea中数据量是否大于设置的范围分区最大数据量阈值range_area_max_kvs,如果不大于,则结束并退出;如果大于,则将范围分区currangearea放入待拆分队列中,结束并退出。
20.所述第二步中,待拆分队列处理线程处理流程如下:
21.s1:判断当前程序是否正在关闭,如果是,则退出线程;
22.s2:判断待拆分队列长度,如果长度为0,则沉睡特定时间(默认阈值为100微秒),然后重新跳转到s2;
23.s3:从待拆分队列中弹出一个范围分区存储到变量currangearea中,修改该范围分区的状态为“正在拆分”;
24.s4:遍历范围分区currangearea的art树,并将数据按照key值的字节序升序存储到队列q中,统计队列中数据量存储到变量s中;
25.s5:计算拆分成的新的范围分区的数量以及每个范围分区的数据量;
26.s6:将队列q中的数据按照顺序插入新的范围分区中;
27.s7:将范围分区currangearea的状态置为“待删除”;
28.s8:处理范围分区currangearea增量数据队列,对于增量数据队列中的每条记录,首先判断记录是否在队列q中,如果存在则跳过,如果不存在,则使用数据插入流程将数据插入到索引结构中;
29.s9:删除范围分区currangearea,释放该范围分区的空间,跳转到s1。
30.所述步骤s5中,新的范围分区的数量n的计算公式如下:
[0031][0032]
第i个新的范围分区的分配到的数据量di计算公式如下:
[0033][0034]
公式中,变量s为范围分区currangearea的数据量;变量m为全局参数范围分区最大数据量range_area_max_kvs;变量p为每个分区分得的数据量比例。
[0035]
所述步骤s5中,每个分区分得的数据量比例p的计算公式如下:
[0036][0037]
公式中,变量s指范围分区currangearea的数据量;变量m指全局参数范围分区最大数据量range_area_max_kvs;变量τ为衰减因子,控制衰减速度,默认配置为10;e为自然
常数。
[0038]
所述步骤s6中,当第i个新范围分区的数据量等于di时,将第i个新范围分区最后插入的key值作为该范围分区的key值,将该新范围分区挂载到第一层art树上,并且停止第i个新范围分区插入数据,改为向第i 1个新范围分区插入。
[0039]
本发明的有益效果是:该基于两层art树的数据存储方法,通过优化存储引擎的索引结构,提升了存储引擎的性能,避免了使用原始的一层art树索引结构带来的索引结构查询性能随着数据量增大而大幅降低的问题。
附图说明
[0040]
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0041]
附图1为本发明两层art树索引结构示意图。
[0042]
附图2为本发明数据插入流程示意图。
[0043]
附图3为本发明待拆分队列处理线程处理流程示意图。
具体实施方式
[0044]
为了使本技术领域的人员更好的理解本发明中的技术方案,下面将结合本发明实施例,对本发明实施例中的技术方案进行清楚,完整的描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
[0045]
对实施例中涉及的术语进行解释:
[0046]
key值:用于检索的字符串或字节数组。
[0047]
value:key值对应的数据。
[0048]
叶子节点:处于art树最底层的节点,这些节点没有子节点;叶子节点用于存储value。
[0049]
中间节点:在art树中除叶子节点外的所有节点。
[0050]
根节点:art树中处于深度0的中间节点,深度0层仅有一个中间节点,就是根节点。
[0051]
该基于两层art树的数据存储方法,按key值范围分区的方式拆分数据,使用两级art树索引结构,第一级art索引用于key值范围分区,第二级art索引用于索引范围分区内的数据;
[0052]
附图1为两层art树的数据存储结构。附图中,最上面的三角形表示第一层art树,下面方框表示范围分区,每个范围分区内有一个三角形表示第二层art树,范围分区内的圆角矩形表示key范围内的数据集。每个范围分区是第一层art树的叶子节点,每个范围分区内的数据集是该范围分区内第二层art树的叶子节点。
[0053]
所述范围分区内的数据集不一定是真实数据的数据集,也可以是数据的指针形成的数据集,而且数据中包含key值信息,可以通过数据生成出对应的key值。
[0054]
包括以下步骤:
[0055]
第一步,数据库存储引擎刚启动时,创建第一个范围分区,其存储key值的范围为(min,max),并且使用该范围分区最大值max作为key值,将范围分区挂载到第一层art树上,
[0056]
第二步,将待插入的数据挂载到范围分区的第二层art树上,启动待拆分队列处理线程作为后台线程,异步优化索引结构。
[0057]
所述第二步中,设置作为全局参数range_area_max_kvs,即范围分区最大数据量阈值;当某个范围分区数据量超过范围分区最大数据量阈值时,将该范围分区拆解成两个。
[0058]
所述第二步中,数据插入流程如下:
[0059]
s1:查询第一层的art树,找到大于等于待插入的key值对应的范围分区,存入变量currangearea中;
[0060]
s2:判断范围分区currangearea的状态,如果状态为“待删除”,则返回s1;
[0061]
s3:将待插入的数据挂载到范围分区currangearea的第二层art树上;
[0062]
s4:判断范围分区currangearea的状态,如果状态为“正在拆分”,则将数据放入该范围分区currangearea的增量数据队列中,结束并退出,否则跳转到s5;
[0063]
s5:判断范围分区currangearea中数据量是否大于设置的范围分区最大数据量阈值range_area_max_kvs,如果不大于,则结束并退出;如果大于,则将范围分区currangearea放入待拆分队列中,结束并退出。
[0064]
所述第二步中,待拆分队列处理线程处理流程如下:
[0065]
s1:判断当前程序是否正在关闭,如果是,则退出线程;
[0066]
s2:判断待拆分队列长度,如果长度为0,则沉睡特定时间(默认阈值为100微秒),然后重新跳转到s2;
[0067]
s3:从待拆分队列中弹出一个范围分区存储到变量currangearea中,修改该范围分区的状态为“正在拆分”;
[0068]
s4:遍历范围分区currangearea的art树,并将数据按照key值的字节序升序存储到队列q中,统计队列中数据量存储到变量s中;
[0069]
s5:计算拆分成的新的范围分区的数量以及每个范围分区的数据量;
[0070]
s6:将队列q中的数据按照顺序插入新的范围分区中;
[0071]
s7:将范围分区currangearea的状态置为“待删除”;
[0072]
s8:处理范围分区currangearea增量数据队列,对于增量数据队列中的每条记录,首先判断记录是否在队列q中,如果存在则跳过,如果不存在,则使用数据插入流程将数据插入到索引结构中;
[0073]
s9:删除范围分区currangearea,释放该范围分区的空间,跳转到s1。
[0074]
所述步骤s5中,新的范围分区的数量n的计算公式如下:
[0075][0076]
第i个新的范围分区的分配到的数据量di计算公式如下:
[0077]
[0078]
公式中,变量s为范围分区currangearea的数据量;变量m为全局参数范围分区最大数据量range_area_max_kvs;变量p为每个分区分得的数据量比例。
[0079]
所述步骤s5中,每个分区分得的数据量比例p的计算公式如下:
[0080][0081]
公式中,变量s指范围分区currangearea的数据量;变量m指全局参数范围分区最大数据量range_area_max_kvs;变量τ为衰减因子,控制衰减速度,默认配置为10;e为自然常数。
[0082]
所述步骤s6中,当第i个新范围分区的数据量等于di时,将第i个新范围分区最后插入的key值作为该范围分区的key值,将该新范围分区挂载到第一层art树上,并且停止第i个新范围分区插入数据,改为向第i 1个新范围分区插入。
[0083]
以上所述的实施例,只是本发明具体实施方式的一种,本领域的技术人员在本发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献