CN117632946A - 基于动态前缀的层级b+树算法、装置及计算机存储介质 - Google Patents
基于动态前缀的层级b+树算法、装置及计算机存储介质 Download PDFInfo
- Publication number
- CN117632946A CN117632946A CN202310299373.2A CN202310299373A CN117632946A CN 117632946 A CN117632946 A CN 117632946A CN 202310299373 A CN202310299373 A CN 202310299373A CN 117632946 A CN117632946 A CN 117632946A
- Authority
- CN
- China
- Prior art keywords
- node
- tree
- prefix
- data
- key
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 230000009466 transformation Effects 0.000 claims abstract description 19
- 230000001131 transforming effect Effects 0.000 claims abstract description 11
- 230000006835 compression Effects 0.000 description 10
- 238000007906 compression Methods 0.000 description 10
- 239000010410 layer Substances 0.000 description 10
- 238000000034 method Methods 0.000 description 7
- 238000012217 deletion Methods 0.000 description 6
- 230000037430 deletion Effects 0.000 description 6
- 238000013500 data storage Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 239000002356 single layer Substances 0.000 description 2
- 239000002699 waste material Substances 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了基于动态前缀的层级B+树算法、装置及计算机存储介质,所述的算法包括:在进行KV数据写入操作时;查询B+树数据库中各B+树的当前叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点;若判断结果为是,则针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点,若判断结果为否,则将新写入的KV数据存储在对应B+树的叶子节点上;基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据。本发明在B+树中引入公共前缀节点,将KV数据中key的具有相同前缀部分写入一次,即可为具有相同前缀key的KV数据所共同引用,极大的降低了KV数据写入磁盘占用的磁盘空间。
Description
技术领域
本发明涉及数据存储技术领域,具体的涉及基于动态前缀的层级B+树算法、装置及计算机存储介质。
背景技术
B+树数据库:以B+树数据结构来创建的数据库,是一种持久化数据库,能提供高效地写入/查询/更新/删除的能力。
磁盘存储领域,B+树数据库是一种支持高性能读写,并支持range查询的技术。B+树数据库存储数据时,key会写入到B+树的索引,而value会写入到内存某一块,同时会在适当时机写入到磁盘中。不同的key会在B+树上生成不同的节点,同一个key则只会使用同一个节点,在数据修改时更新value即可。当key的长度较大,而value较小的时候,磁盘空间大小主要取决于key的长度和key的数量。而此时如果有大量的key是有公共前缀时,这些大量有公共前缀的key写入到磁盘中,对磁盘的空间占用是显著的。
有鉴于此,特提出本发明专利。
发明内容
为了解决B+树在key较长且有大量公共前缀的key而value较小的时候,占用磁盘较大的问题,本发明提供基于动态前缀的层级B+树算法、装置及计算机存储介质,具体地,采用了如下技术方案:
基于动态前缀的层级B+树算法,包括:
在进行KV数据写入操作时;
查询B+树数据库中各B+树的当前叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点;
若判断结果为是,则针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点,若判断结果为否,则将新写入的KV数据存储在对应B+树的叶子节点上;
基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据。
作为本发明的可选实施方式,本发明的基于动态前缀的层级B+树算法中,所述查询B+树数据库中各B+树的当前叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点包括:
预设公共前缀节点中key的字节数为N;
获取新写入KV数据中key的前N位字节,查询B+树数据库中各B+树的当前叶子节点的前N位字节,进行比对;
若新写入KV数据的key的前N位字节与B+树中当前叶子节点的前N位字节相同,则B+树中存在与新写入的KV数据的key具有相同前缀的叶子节点;
可选地,所述的N≥8Byte。
作为本发明的可选实施方式,本发明的基于动态前缀的层级B+树算法中,所述针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点包括:
所述公共前缀节点的key存储叶子节点中的key与新写入KV数据中的key的相同前缀字节部分,所述公共前缀节点存储的value为key的相同前缀字节部分所对应的value;
可选地,若key的相同前缀字节部分所对应的value不存在,则公共前缀节点存储的value为0。
作为本发明的可选实施方式,本发明的基于动态前缀的层级B+树算法中,所述基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据包括:
基于所述公共前缀节点生成新的B+树;
所述新的B+树具有新的根节点,所述具有相同前缀叶子节点基于新的根节点创建新的叶子节点,新的叶子节点的key为除去相同前缀字节后剩余字节部分,value为相同前缀叶子节点的原value;
新写入的KV数据基于新的根节点创建叶子节点,叶子节点的key为除去相同前缀字节后剩余字节部分,叶子节点的value为KV数据的value。
作为本发明的可选实施方式,本发明的基于动态前缀的层级B+树算法,包括:
在进行KV数据写入操作时;
查询B+树数据库中各B+树是否存在与新写入KV数据的key前N位字节相同的公共前缀节点,若存在,则将新写入的KV数据直接存储在公共前缀节点下的B+树中,若不存在,则将新写入的KV数据存储在非公共前缀节点下的B+树对应的叶子节点上。
作为本发明的可选实施方式,本发明的基于动态前缀的层级B+树算法,包括:
在进行数据查询操作时;
判断查询key的字节长度是否大于等于N;
若判断结果为否,则递归查询B+树数据库中第0层B+树的分支节点/叶子节点,并返回查询结果,若判断结果为是,则查询B+树数据库中是否存在与查询key具有相同前缀的公共前缀节点,并基于公共前缀节点下的B+树进行查询,返回查询结果。
作为本发明的可选实施方式,本发明的基于动态前缀的层级B+树算法,包括:
若判断查询key的字节长度小于N,则递归查询B+树数据库中第0层B+树的分支节点,若分支节点查询成功,则通过分支节点定位到叶子节点,则将查询到的叶子节点的value数据返回,若分支节点查询失败,则返回查询失败;
若判断查询key的字节长度大于等于N,则根据查询key的前N个字符查询是否存在公共前缀节点:若存在公共前缀节点,则判断查询key除去前N个字符后的剩余字符的长度是否为0,若判断结果为是,则返回公共前缀节点对应的value,若判断结果为否,则根据查询key除去前N个字符后的剩余字符部分继续递归查询公共前缀节点下B+树中的分支节点/叶子节点,并返回查询结果;
若不存在公共前缀节点,则返回递归查询查询B+树数据库中第0层各B+树的所有叶子节点分支节点/叶子节点,并返回查询结果。
作为本发明的可选实施方式,本发明的基于动态前缀的层级B+树算法,包括:
在进行数据删除操作时;
根据删除key通过查询操作查询B+树数据库中各B+树的对应节点;
如果查询的节点是叶子节点,则删除该叶子节点,然后做B+树的平衡;
如果查询的节点是公共前缀节点下B+树的叶子节点,则删除该叶子节点,并检查对应的公共前缀节点下B+树包含的元素数目,如果大于等于2则不操作,如果小于2,则将该公共前缀节点变换调整为所属B+树的叶子节点。
本发明同时提供一种基于动态前缀的层级B+树装置,包括:
数据写入模块,在进行KV数据写入操作时;
查询模块,查询B+树数据库中各B+树的当前各叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点;
公共前缀节点模块,若判断结果为是,则针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点,若判断结果为否,则将新写入的KV数据存储在对应B+树的叶子节点上,基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据。
本发明同时还提供一种计算机可读存储介质,存储有计算机可执行程序,所述计算机可执行程序被执行时,实现所述的基于动态前缀的层级B+树算法。
与现有技术相比,本发明的有益效果:
本发明的基于动态前缀的层级B+树算法,针对B+树存储大量公共前缀key时,同时如果value比较小,此时磁盘空间占用取决于key长度,此时key的前缀会写很多份造成磁盘占用较多的问题,提出了在B+树中引入公共前缀节点,公共前缀节点将KV数据中key的具有相同前缀部分写入一次,即可为具有相同前缀key的KV数据所共同引用,只需将KV数据中key的非相同前缀部分写入公共前缀节点下的B+树上,极大的降低了KV数据写入磁盘占用的磁盘空间。
附图说明:
图1本发明实施基于动态前缀的层级B+树算法的数据写入操作流程图;
图2本发明实施例基于动态前缀的层级B+树算法生成的层级B+树结构图;
图3本发明实施例基于动态前缀的层级B+树算法的数据查询操作流程图;
图4本发明实施例基于动态前缀的层级B+树算法的数据删除操作流程图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图,对本发明实施例中的技术方案进行清楚、完整的描述。显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。
因此,以下对本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的部分实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征和技术方案可以相互组合。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本发明的描述中,需要说明的是,术语“上”、“下”等指示的方位或位置关系为基于附图所示的方位或位置关系,或者是该发明产品使用时惯常摆放的方位或位置关系,或者是本领域技术人员惯常理解的方位或位置关系,这类术语仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
参见图1所示,本实施例的基于动态前缀的层级B+树算法,包括:
在进行KV数据写入操作时;
查询B+树数据库中各B+树的当前叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点;
若判断结果为是,则针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点,若判断结果为否,则将新写入的KV数据存储在对应B+树的叶子节点上;
基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据。
本发明的基于动态前缀的层级B+树算法,针对B+树存储大量公共前缀key时,同时如果value比较小,此时磁盘空间占用取决于key长度,此时key的前缀会写很多份造成磁盘占用较多的问题,提出了在B+树中引入公共前缀节点,公共前缀节点将KV数据中key的具有相同前缀部分写入一次,即可为具有相同前缀key的KV数据所共同引用,只需将KV数据中key的非相同前缀部分写入公共前缀节点下的B+树上,极大的降低了KV数据写入磁盘占用的磁盘空间。
举例说明,本实施例的基于动态前缀的层级B+树算法相对于现有的B+树存储数据的方式压缩的磁盘占用空间比较:假设有10000个15字节的key,且这些key前8个字节相同,用传统的B+树存储占用磁盘空间15B*10000=150KB,用改进后的层级B+树存储:1个公共前缀节点,9999个公共前缀下B+树的叶子节点,磁盘占用空间为1*8B+9999*7B=70001B=70KB,磁盘空间节省46.67%。
作为本实施例的可选实施方式,本实施例所述的基于动态前缀的层级B+树算法中,所述查询B+树数据库中各B+树的当前叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点包括:
预设公共前缀节点中key的字节数为N;
获取新写入KV数据中key的前N位字节,查询B+树数据库中各B+树的当前叶子节点的前N位字节,进行比对;
若新写入KV数据的key的前N位字节与B+树中当前叶子节点的前N位字节相同,则B+树中存在与新写入的KV数据的key具有相同前缀的叶子节点。
本实施例设定公共前缀节点中key是N个字节,不满足N字节不会生成公共前缀节点,满足N字节且有重复的前缀是才会生成公共前缀节点,公共前缀节点中key设定为N字节的原因是太短的key分裂会造成公共前缀节点的增加,B+树生成的内存和查询的CPU消耗会增加,更长的key压缩效率很有可能会变低。
可选地,本实施例所述的N≥8Byte。
进一步地,本实施例所述的基于动态前缀的层级B+树算法中,所述针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点包括:
所述公共前缀节点的key存储叶子节点中的key与新写入KV数据中的key的相同前缀字节部分,所述公共前缀节点存储的value为key的相同前缀字节部分所对应的value。
可选地,若key的相同前缀字节部分所对应的value不存在,则公共前缀节点存储的value为0。
进一步地,本实施例的基于动态前缀的层级B+树算法中,所述基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据包括:
基于所述公共前缀节点生成新的B+树;
所述新的B+树具有新的根节点,所述具有相同前缀叶子节点基于新的根节点创建新的叶子节点,新的叶子节点的key为除去相同前缀字节后剩余字节部分,value为相同前缀叶子节点的原value;
新写入的KV数据基于新的根节点创建叶子节点,叶子节点的key为除去相同前缀字节后剩余字节部分,叶子节点的value为KV数据的value。
因此,本实施例的基于动态前缀的层级B+树算法,生成的层级B+树结构如图2所示,以第0层为例,具有如下类型的节点:
a,root节点:根节点,每棵B+树仅有1个根节点;
b,branch节点:分支节点,该节点只存储索引,不存储数据;
c,leaf节点:叶子节点,该节点存储数据,查询到leaf节点是最终结果,不会有向下的节点;
d,prefix节点:公共前缀节点,该节点存储数据,并且从该节点生成新的B+树;这个节点用来对前缀压缩的关键。
本实施例的基于动态前缀的层级B+树算法,对于前缀key的压缩是个创新,层级B+树能支持单层/多层的key压缩,该算法使得B+树也能海量公共前缀下具备良好的内存/磁盘占用。
作为本实施例的可选实施方式,本实施例的基于动态前缀的层级B+树算法,包括:
在进行KV数据写入操作时;
查询B+树数据库中各B+树是否存在与新写入KV数据的key前N位字节相同的公共前缀节点,若存在,则将新写入的KV数据直接存储在公共前缀节点下的B+树中,若不存在,则将新写入的KV数据存储在非公共前缀节点下的B+树对应的叶子节点上。
作为本实施例的可选实施方式,参见图3所示,本实施例的基于动态前缀的层级B+树算法,包括:
在进行数据查询操作时;
判断查询key的字节长度是否大于等于N;
若判断结果为否,则递归查询B+树数据库中第0层B+树的分支节点/叶子节点,并返回查询结果,若判断结果为是,则查询B+树数据库中是否存在与查询key具有相同前缀的公共前缀节点,并基于公共前缀节点下的B+树进行查询,返回查询结果。
本实施例的基于动态前缀的层级B+树算法,在进行数据查询操作时,基于查询key的字节长度进行查询,当查询key的字节长度短于公共前缀节点,则只需查询非公共前缀节点下B+树的叶子节点,只有当查询key的字节长度等于或者长于公共前缀节点时,才会进行公共前缀节点下B+树的叶子节点查询,确保了查询的效率,避免数据查询时CPU消耗过大。
进一步地,本实施例的基于动态前缀的层级B+树算法,包括:
若判断查询key的字节长度小于N,则递归查询B+树数据库中第0层B+树的分支节点,若分支节点查询成功,则通过分支节点定位到叶子节点,则将查询到的叶子节点的value数据返回,若分支节点查询失败,则返回查询失败;
若判断查询key的字节长度大于等于N,则根据查询key的前N个字符查询是否存在公共前缀节点:若存在公共前缀节点,则判断查询key除去前N个字符后的剩余字符的长度是否为0,若判断结果为是,则返回公共前缀节点对应的value,若判断结果为否,则根据查询key除去前N个字符后的剩余字符部分继续递归查询公共前缀节点下B+树中的分支节点/叶子节点,并返回查询结果;
若不存在公共前缀节点,则返回递归查询查询B+树数据库中第0层各B+树的所有叶子节点分支节点/叶子节点,并返回查询结果。
作为本实施例的可选实施方式,参见图4所示,本实施例的基于动态前缀的层级B+树算法,包括:
在进行数据删除操作时;
根据删除key通过查询操作查询B+树数据库中各B+树的对应节点;
如果查询的节点是叶子节点,则删除该叶子节点,然后做B+树的平衡,同时判断该叶子节点所属B+树的分支节点中是否存在该叶子节点,有则从分支节点中移除该节点的指针;
如果查询的节点是公共前缀节点下B+树的叶子节点,则删除该叶子节点,并检查对应的公共前缀节点下B+树包含的元素数目,如果大于等于2则不操作,如果小于2,则将该公共前缀节点变换调整为所属B+树的叶子节点。
本实施例的基于动态前缀的层级B+树算法,在进行数据删除操作时,需要判断公共前缀节点下B+树包含的元素数目,若公共前缀节点下B+树包含的元素数目小于2,则将该公共前缀节点变换调整为所属B+树的叶子节点,避免元素数目小于2的公共前缀节点造成磁盘存储空间的浪费,以及在进行数据查询时影响数据查询的效率。
具体地,本实施例的基于动态前缀的层级B+树算法,进行如下具体示例说明:
系统设定的公共前缀节点是8Byte(8字节),不满足8字节不会生成公共前缀节点,满足8字节且有重复的前缀是才会生成公共前缀节点。设定为8字节的原因是太短的key分裂会造成公共前缀节点的增加,B+树生成的内存和查询的CPU消耗会增加,更长的key压缩效率很有可能会变低。
写入操作:
1,写入key(“12345678”),生成新的叶子节点,加入到B+树的某个分支节点下(如果没有则新建分支节点加入到该分支节点下)。
2,写入key(“123456789”),查询前缀key(“12345678”),发现有该元素,则对查询到节点做节点变换操作,叶子节点变化为公共前缀节点,value为key(“12345678”)对应的value,并在公共前缀节点下生成新的B+树,创建叶子节点(key变更为“9”,value还是“123456789”对应的value),前缀(“12345678”)被省去,只存储剩余的key,节点变换完毕。
3,写入key(“1234567890”),查询前缀key(“12345678”),发现有该元素且已经是公共前缀节点,则将叶子节点(key=“90”,value为“1234567890”对应的value)写入公共前缀节点下B+树的叶子节点中,写入完成。
查询操作:
1,查询某个key,查询失败则直接返回空;
2,查询某个key,如果key的长度是8B以内(不包含8B),查询成功,
且查询到的节点是叶子节点,则将该节点的value返回;
3,查询某个key,如果key的长度是8B以上(包含8B),则查询key的前8个字节,假如查询到的节点是公共前缀节点,则根据剩余的key进一步查询(比如查询的key为10字节,去除公共前缀节点的8字节后剩余2字节,根据这2个字节继续查询),查询成功则返回,查询失败亦返回。
删除操作:
1,先使用查询操作,查询到对应的节点,如果节点为空,则不处理;
2,如果查询的节点是叶子节点,则删除该叶子节点,同时判断分支节点中是否该节点,有则从分支节点中移除该节点的指针;
3,如果查询的节点是公共前缀节点下B+树的叶子节点,则删除该叶子节点,并检查对应的公共前缀节点包含的元素数目,如果大于等于2则不操作,如果为0或者1,则将该公共前缀节点调整为leaf节点。
本实施例同时提供一种基于动态前缀的层级B+树装置,包括:
数据写入模块,在进行KV数据写入操作时;
查询模块,查询B+树数据库中各B+树的当前各叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点;
公共前缀节点模块,若判断结果为是,则针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点,若判断结果为否,则将新写入的KV数据存储在对应B+树的叶子节点上,基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据。
本发明的基于动态前缀的层级B+树装置,针对B+树存储大量公共前缀key时,同时如果value比较小,此时磁盘空间占用取决于key长度,此时key的前缀会写很多份造成磁盘占用较多的问题,提出了在B+树中引入公共前缀节点,公共前缀节点将KV数据中key的具有相同前缀部分写入一次,即可为具有相同前缀key的KV数据所共同引用,只需将KV数据中key的非相同前缀部分写入公共前缀节点下的B+树上,极大的降低了KV数据写入磁盘占用的磁盘空间。
举例说明,本实施例的基于动态前缀的层级B+树装置相对于现有的B+树存储数据的方式压缩的磁盘占用空间比较:假设有10000个15字节的key,且这些key前8个字节相同,用传统的B+树存储占用磁盘空间15B*10000=150KB,用改进后的层级B+树存储:1个公共前缀节点,9999个公共前缀下B+树的叶子节点,磁盘占用空间为1*8B+9999*7B=70001B=70KB,磁盘空间节省46.67%。
作为本实施例的可选实施方式,本实施例所述的基于动态前缀的层级B+树装置,所述查询模块,查询B+树数据库中各B+树的当前叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点包括:
预设公共前缀节点中key的字节数为N;
获取新写入KV数据中key的前N位字节,查询B+树数据库中各B+树的当前叶子节点的前N位字节,进行比对;
若新写入KV数据的key的前N位字节与B+树中当前叶子节点的前N位字节相同,则B+树中存在与新写入的KV数据的key具有相同前缀的叶子节点。
本实施例设定公共前缀节点中key是N个字节,不满足N字节不会生成公共前缀节点,满足N字节且有重复的前缀是才会生成公共前缀节点,公共前缀节点中key设定为N字节的原因是太短的key分裂会造成公共前缀节点的增加,B+树生成的内存和查询的CPU消耗会增加,更长的key压缩效率很有可能会变低。
可选地,本实施例所述的N≥8Byte。
进一步地,本实施例所述的基于动态前缀的层级B+树装置,所述公共前缀节点模块,针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点包括:
所述公共前缀节点的key存储叶子节点中的key与新写入KV数据中的key的相同前缀字节部分,所述公共前缀节点存储的value为key的相同前缀字节部分所对应的value。
可选地,若key的相同前缀字节部分所对应的value不存在,则公共前缀节点存储的value为0。
进一步地,本实施例的基于动态前缀的层级B+树装置,所述公共前缀节点模块,基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据包括:
基于所述公共前缀节点生成新的B+树;
所述新的B+树具有新的根节点,所述具有相同前缀叶子节点基于新的根节点创建新的叶子节点,新的叶子节点的key为除去相同前缀字节后剩余字节部分,value为相同前缀叶子节点的原value;
新写入的KV数据基于新的根节点创建叶子节点,叶子节点的key为除去相同前缀字节后剩余字节部分,叶子节点的value为KV数据的value。
因此,本实施例的基于动态前缀的层级B+树装置,生成的层级B+树结构如图2所示,以第0层为例,具有如下类型的节点:
a,root节点:根节点,每棵B+树仅有1个根节点;
b,branch节点:分支节点,该节点只存储索引,不存储数据;
c,leaf节点:叶子节点,该节点存储数据,查询到leaf节点是最终结果,不会有向下的节点;
d,prefix节点:公共前缀节点,该节点存储数据,并且从该节点生成新的B+树;这个节点用来对前缀压缩的关键。
本实施例的基于动态前缀的层级B+树装置,对于前缀key的压缩是个创新,层级B+树能支持单层/多层的key压缩,该算法使得B+树也能海量公共前缀下具备良好的内存/磁盘占用。
作为本实施例的可选实施方式,本实施例的基于动态前缀的层级B+树装置,包括:
数据写入模块,在进行KV数据写入操作时;
查询模块,查询B+树数据库中各B+树是否存在与新写入KV数据的key前N位字节相同的公共前缀节点,若存在,则将新写入的KV数据直接存储在公共前缀节点下的B+树中,若不存在,则将新写入的KV数据存储在非公共前缀节点下的B+树对应的叶子节点上。
作为本实施例的可选实施方式,本实施例的基于动态前缀的层级B+树装置,包括:
数据查询模块,在进行数据查询操作时;
判断查询key的字节长度是否大于等于N;
若判断结果为否,则查询B+树数据库中各B+树的所有叶子节点,并返回查询结果,若判断结果为是,则查询B+树数据库中各主B+树是否存在与查询key具有相同前缀的公共前缀节点,并基于公共前缀节点下的B+树进行查询,返回查询结果。
本实施例的基于动态前缀的层级B+树装置,数据查询模块在进行数据查询操作时,基于查询key的字节长度进行查询,当查询key的字节长度短于公共前缀节点,则只需查询非公共前缀节点下B+树的叶子节点,只有当查询key的字节长度等于或者长于公共前缀节点时,才会进行公共前缀节点下B+树的叶子节点查询,确保了查询的效率,避免数据查询时CPU消耗过大。
进一步地,本实施例的基于动态前缀的层级B+树装置,包括:
数据删除模块,在进行数据查询操作时;
判断查询key的字节长度是否大于等于N;
若判断结果为否,则查询B+树数据库中各B+树的所有叶子节点:查询成功,则将查询到的叶子节点的value数据返回,查询失败,则返回查询失败;
若判断结果为是,则根据查询key的前N个字符查询是否存在公共前缀节点,若存在公共前缀节点,则根据查询key除去前N个字符后的剩余字符部分继续查询公共前缀节点下B+树中的叶子节点,并返回查询结果,若不存在公共前缀节点,则返回查询失败。
作为本实施例的可选实施方式,本实施例的基于动态前缀的层级B+树装置,包括:
数据删除模块,在进行数据删除操作时;
根据删除key通过查询操作查询B+树数据库中各B+树的对应节点;
如果查询的节点是叶子节点,则删除该叶子节点,同时判断该叶子节点所属B+树的分支节点中是否存在该叶子节点,有则从分支节点中移除该节点的指针;
如果查询的节点是公共前缀节点下B+树的叶子节点,则删除该叶子节点,并检查对应的公共前缀节点下B+树包含的元素数目,如果大于等于2则不操作,如果小于2,则将该公共前缀节点变换调整为所属B+树的叶子节点。
本实施例的基于动态前缀的层级B+树装置,数据删除模块在进行数据删除操作时,需要判断公共前缀节点下B+树包含的元素数目,若公共前缀节点下B+树包含的元素数目小于2,则将该公共前缀节点变换调整为所属B+树的叶子节点,避免元素数目小于2的公共前缀节点造成磁盘存储空间的浪费,以及在进行数据查询时影响数据查询的效率。
具体地,本实施例的基于动态前缀的层级B+树装置,进行如下具体示例说明:
基于动态前缀的层级B+树装置设定的公共前缀节点是8Byte(8字节),不满足8字节不会生成公共前缀节点,满足8字节且有重复的前缀是才会生成公共前缀节点。设定为8字节的原因是太短的key分裂会造成公共前缀节点的增加,B+树生成的内存和查询的CPU消耗会增加,更长的key压缩效率很有可能会变低。
写入操作:
1,数据写入模块写入key(“12345678”),生成新的叶子节点,加入到B+树的某个分支节点下(如果没有则新建分支节点加入到该分支节点下)。
2,数据写入模块写入key(“123456789”),查询前缀key(“12345678”),发现有该元素,则对查询到节点做节点变换操作,叶子节点变化为公共前缀节点,value为key(“12345678”)对应的value,并在公共前缀节点下生成新的B+树,创建叶子节点(key变更为“9”,value还是“123456789”对应的value),前缀(“12345678”)被省去,只存储剩余的key,节点变换完毕。
3,数据写入模块写入key(“1234567890”),查询前缀key(“12345678”),发现有该元素且已经是公共前缀节点,则将叶子节点(key=“90”,value为“1234567890”对应的value)写入公共前缀节点下B+树的叶子节点中,写入完成。
查询操作:
1,数据查询模块查询某个key,查询失败则直接返回空;
2,数据查询模块查询某个key,如果key的长度是8B以内(不包含8B),查询成功,且查询到的节点是叶子节点,则将该节点的value返回;
3,数据查询模块查询某个key,如果key的长度是8B以上(包含8B),则查询key的前8个字节,假如查询到的节点是公共前缀节点,则根据剩余的key进一步查询(比如查询的key为10字节,去除公共前缀节点的8字节后剩余2字节,根据这2个字节继续查询),查询成功则返回,查询失败亦返回。
删除操作:
1,数据删除模块先使用查询操作,查询到对应的节点,如果节点为空,则不处理;
2,如果查询的节点是叶子节点,则删除该叶子节点,同时判断分支节点中是否该节点,有则从分支节点中移除该节点的指针;
3,如果查询的节点是公共前缀节点下B+树的叶子节点,则删除该叶子节点,并检查对应的公共前缀节点包含的元素数目,如果大于等于2则不操作,如果为0或者1,则将该公共前缀节点调整为leaf节点。
本实施例同时提供一种计算机可读存储介质,存储有计算机可执行程序,所述计算机可执行程序被执行时,实现所述基于动态前缀的层级B+树算法。
本实施例所述计算机可读存储介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读存储介质还可以是可读存储介质以外的任何可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
本实施例还提供了一种电子设备,包括处理器和存储器,所述存储器用于存储计算机可执行程序,当所述计算机程序被所述处理器执行时,所述处理器执行所述基于动态前缀的层级B+树算法。
电子设备以通用计算设备的形式表现。其中处理器可以是一个,也可以是多个并且协同工作。本发明也不排除进行分布式处理,即处理器可以分散在不同的实体设备中。本发明的电子设备并不限于单一实体,也可以是多个实体设备的总和。
所述存储器存储有计算机可执行程序,通常是机器可读的代码。所述计算机可读程序可以被所述处理器执行,以使得电子设备能够执行本发明的方法,或者方法中的至少部分步骤。
所述存储器包括易失性存储器,例如随机存取存储单元(RAM)和/或高速缓存存储单元,还可以是非易失性存储器,如只读存储单元(ROM)。
应当理解,本发明的电子设备中还可以包括上述示例中未示出的元件或组件。例如,有些电子设备中还包括有显示屏等显示单元,有些电子设备还包括人机交互元件,例如按钮、键盘等。只要该电子设备能够执行存储器中的计算机可读程序以实现本发明方法或方法的至少部分步骤,均可认为是本发明所涵盖的电子设备。
通过以上对实施方式的描述,本领域的技术人员易于理解,本发明可以由能够执行特定计算机程序的硬件来实现,例如本发明的系统,以及系统中包含的电子处理单元、服务器、客户端、手机、控制单元、处理器等。本发明也可以由执行本发明的方法的计算机软件来实现,例如由微处理器、电子控制单元,客户端、服务器端等执行的控制软件来实现。但需要说明的是,执行本发明的方法的计算机软件并不限于由一个或特定个的硬件实体中执行,其也可以是由不特定具体硬件的以分布式的方式来实现。对于计算机软件,软件产品可以存储在一个计算机可读的存储介质(可以是CD-ROM,U盘,移动硬盘等)中,也可以分布式存储于网络上,只要其能使得电子设备执行根据本发明的方法。
以上实施例仅用以说明本发明而并非限制本发明所描述的技术方案,尽管本说明书参照上述的各个实施例对本发明已进行了详细的说明,但本发明不局限于上述具体实施方式,因此任何对本发明进行修改或等同替换;而一切不脱离发明的精神和范围的技术方案及其改进,其均涵盖在本发明的权利要求范围当中。
Claims (10)
1.基于动态前缀的层级B+树算法,其特征在于,包括:
在进行KV数据写入操作时;
查询B+树数据库中各B+树的当前叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点;
若判断结果为是,则针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点,若判断结果为否,则将新写入的KV数据存储在对应B+树的叶子节点上;
基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据。
2.根据权利要求1所述的基于动态前缀的层级B+树算法,其特征在于,所述查询B+树数据库中各B+树的当前叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点包括:
预设公共前缀节点中key的字节数为N;
获取新写入KV数据中key的前N位字节,查询B+树数据库中各B+树的当前叶子节点的前N位字节,进行比对;
若新写入KV数据的key的前N位字节与B+树中当前叶子节点的前N位字节相同,则B+树中存在与新写入的KV数据的key具有相同前缀的叶子节点;
可选地,所述的N≥8Byte。
3.根据权利要求2所述的基于动态前缀的层级B+树算法,其特征在于,所述针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点包括:
所述公共前缀节点的key存储叶子节点中的key与新写入KV数据中的key的相同前缀字节部分,所述公共前缀节点存储的value为key的相同前缀字节部分所对应的value;
可选地,若key的相同前缀字节部分所对应的value不存在,则公共前缀节点存储的value为0。
4.根据权利要求3所述的基于动态前缀的层级B+树算法,其特征在于,所述基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据包括:
基于所述公共前缀节点生成新的B+树;
所述新的B+树具有新的根节点,所述具有相同前缀叶子节点基于新的根节点创建新的叶子节点,新的叶子节点的key为除去相同前缀字节后剩余字节部分,value为相同前缀叶子节点的原value;
新写入的KV数据基于新的根节点创建叶子节点,叶子节点的key为除去相同前缀字节后剩余字节部分,叶子节点的value为KV数据的value。
5.根据权利要求2所述的基于动态前缀的层级B+树算法,其特征在于,包括:
在进行KV数据写入操作时;
查询B+树数据库中各B+树是否存在与新写入KV数据的key前N位字节相同的公共前缀节点,若存在,则将新写入的KV数据直接存储在公共前缀节点下的B+树中,若不存在,则将新写入的KV数据存储在非公共前缀节点下的B+树对应的叶子节点上。
6.根据权利要求2-5任意一项所述的基于动态前缀的层级B+树算法,其特征在于,包括:
在进行数据查询操作时;
判断查询key的字节长度是否大于等于N;
若判断结果为否,则递归查询B+树数据库中第0层B+树的分支节点/叶子节点,并返回查询结果,若判断结果为是,则查询B+树数据库中是否存在与查询key具有相同前缀的公共前缀节点,并基于公共前缀节点下的B+树进行查询,返回查询结果。
7.根据权利要求6所述的基于动态前缀的层级B+树算法,其特征在于,包括:
若判断查询key的字节长度小于N,则递归查询B+树数据库中第0层B+树的分支节点,若分支节点查询成功,则通过分支节点定位到叶子节点,则将查询到的叶子节点的value数据返回,若分支节点查询失败,则返回查询失败;
若判断查询key的字节长度大于等于N,则根据查询key的前N个字符查询是否存在公共前缀节点:若存在公共前缀节点,则判断查询key除去前N个字符后的剩余字符的长度是否为0,若判断结果为是,则返回公共前缀节点对应的value,若判断结果为否,则根据查询key除去前N个字符后的剩余字符部分继续递归查询公共前缀节点下B+树中的分支节点/叶子节点,并返回查询结果;
若不存在公共前缀节点,则返回递归查询查询B+树数据库中第0层各B+树的所有叶子节点分支节点/叶子节点,并返回查询结果。
8.根据权利要求6所述的基于动态前缀的层级B+树算法,其特征在于,包括:
在进行数据删除操作时;
根据删除key通过查询操作查询B+树数据库中各B+树的对应节点;
如果查询的节点是叶子节点,则删除该叶子节点,然后做B+树的平衡;
如果查询的节点是公共前缀节点下B+树的叶子节点,则删除该叶子节点,并检查对应的公共前缀节点下B+树包含的元素数目,如果大于等于2则不操作,如果小于2,则将该公共前缀节点变换调整为所属B+树的叶子节点。
9.基于动态前缀的层级B+树装置,其特征在于,包括:
数据写入模块,在进行KV数据写入操作时;
查询模块,查询B+树数据库中各B+树的当前各叶子节点,判断是否存在与新写入的KV数据的key具有相同前缀的叶子节点;
公共前缀节点模块,若判断结果为是,则针对具有相同前缀的叶子节点做节点变换操作,将具有相同前缀的叶子节点变换为公共前缀节点,若判断结果为否,则将新写入的KV数据存储在对应B+树的叶子节点上,基于公共前缀节点生成新的B+树,存储具有相同前缀叶子节点的KV数据和新写入的KV数据。
10.一种计算机可读存储介质,其特征在于,存储有计算机可执行程序,所述计算机可执行程序被执行时,实现如权利要求1-8任意一项所述的基于动态前缀的层级B+树算法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310299373.2A CN117632946A (zh) | 2023-03-24 | 2023-03-24 | 基于动态前缀的层级b+树算法、装置及计算机存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310299373.2A CN117632946A (zh) | 2023-03-24 | 2023-03-24 | 基于动态前缀的层级b+树算法、装置及计算机存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117632946A true CN117632946A (zh) | 2024-03-01 |
Family
ID=90034493
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310299373.2A Pending CN117632946A (zh) | 2023-03-24 | 2023-03-24 | 基于动态前缀的层级b+树算法、装置及计算机存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117632946A (zh) |
-
2023
- 2023-03-24 CN CN202310299373.2A patent/CN117632946A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10102253B2 (en) | Minimizing index maintenance costs for database storage regions using hybrid zone maps and indices | |
US9576024B2 (en) | Hierarchy of servers for query processing of column chunks in a distributed column chunk data store | |
US7464247B2 (en) | System and method for updating data in a distributed column chunk data store | |
US8843454B2 (en) | Elimination of duplicate objects in storage clusters | |
US7921132B2 (en) | System for query processing of column chunks in a distributed column chunk data store | |
US11176099B2 (en) | Lockless synchronization of LSM tree metadata in a distributed system | |
US7921131B2 (en) | Method using a hierarchy of servers for query processing of column chunks in a distributed column chunk data store | |
US20070143248A1 (en) | Method using query processing servers for query processing of column chunks in a distributed column chunk data store | |
US20070061542A1 (en) | System for a distributed column chunk data store | |
US11074225B2 (en) | Synchronization of index copies in an LSM tree file system | |
US7921087B2 (en) | Method for query processing of column chunks in a distributed column chunk data store | |
US20090287986A1 (en) | Managing storage of individually accessible data units | |
US20070061543A1 (en) | Method for a distributed column chunk data store | |
CN107704202B (zh) | 一种数据快速读写的方法和装置 | |
US8943050B2 (en) | Method and apparatus for optimizing directory performance | |
US20170270149A1 (en) | Database systems with re-ordered replicas and methods of accessing and backing up databases | |
EP3998535A1 (en) | Air freight rate data caching method and system | |
CN115918110A (zh) | 使用键值存储库的空间搜索 | |
US20210056085A1 (en) | Deduplication of data via associative similarity search | |
CN116028505A (zh) | 一种在分布式数据库中实现高可用序列的方法 | |
CN117632946A (zh) | 基于动态前缀的层级b+树算法、装置及计算机存储介质 | |
CN109947775B (zh) | 数据处理方法、装置、电子设备及计算机可读介质 | |
CN112711627B (zh) | 一种Greenplum数据库的数据导入方法、装置及设备 | |
US11119999B2 (en) | Zero-overhead hash filters | |
US20230376461A1 (en) | Supporting multiple fingerprint formats for data file segment |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |