一种内存数据库varchar字段的存储方法及装置与流程

文档序号:17762655发布日期:2019-05-24 21:50阅读:311来源:国知局
一种内存数据库varchar字段的存储方法及装置与流程

本发明涉及数据处理技术领域,具体涉及一种内存数据库varchar字段的存储方法及装置。



背景技术:

现有技术在内存数据库中支持varchar字段时,要么数据表每一行的数据行长度不固定,根据varchar实际使用的长度来确定,数据行为变长,这样每个数据行在内存中排列不整齐,影响访问速度,同时由于数据行的更新和删除,会造成很多长度不一致的内存碎片,影响下一次数据行空间的分配,碎片程度严重时需要进行页面碎片整理,页面碎片整理期间,整个内存页上的其它数据行都需要被锁定,影响并发访问性能。

并且,现有技术中,多要求在内存中首尾对齐(整个数据行首位对齐,或者溢出字段在别的内存页首位对齐),连续地分配空间和使用,随着时间增长,内存碎片化严重,内存使用率低,若进行内存碎片整理,需要整个内存页面加锁,影响并发访问性能。



技术实现要素:

有鉴于此,本发明实施例提供了一种内存数据库varchar字段的存储方法及装置,以解决现有的内存数据存储方法存在的内存碎片较多,影响并发访问性能的问题。

根据第一方面,本发明实施例提供了一种内存数据库varchar字段的存储方法,包括:在内存数据库中构建多行长度固定的数据行,各所述数据行分别用以存储一varchar字段;分别为各所述varchar字段配置内存溢出页面;根据各所述varchar字段的字节数将所述varchar字段存储在所述数据行中,或者,存储在所述数据行及内存溢出页面中。

结合第一方面,在第一方面第一实施方式中,各所述varchar字段的内存溢出页面并不共用。

结合第一方面或第一方面第一实施方式,在第一方面第二实施方式中,所述内存溢出页面中的各溢出字段,使用至多一溢出行。

结合第一方面,在第一方面第三实施方式中,根据各所述varchar字段的字节数将所述varchar字段存储在所述数据行中,包括:当所述varchar字段的字节数小于所述数据行的字节限值时,将所述数据行中的第1个字节存储所述varchar字段的长度,所述数据行的其他空间用于存储所述varchar字段的字符串。

结合第一方面,在第一方面第四实施方式中,根据各所述varchar字段的字节数将所述varchar字段存储在所述数据行中,包括:当所述varchar字段的字节数大于或等于所述数据行的字节限值时,将所述数据行的前2个字节用于存储所述varchar字段的长度,后4个字节用于存储表示溢出字段的页号及表示溢出字段的行号,并将所述varchar字段对应的内存溢出页划分为多组不同类型的溢出页,分别用于存储所述varchar字段的字符串。

结合第一方面第四实施方式,在第一方面第五实施方式中,每组不同类型的溢出页的数据行长度不相等。

根据第二方面,本发明实施例提供了一种内存数据库varchar字段的存储装置,包括:数据行构建模块,用于在内存数据库中构建多行长度固定的数据行,各所述数据行分别用以存储一varchar字段;溢出页面配置模块,用于分别为各所述varchar字段配置内存溢出页面;字段数据存储模块,用于根据各所述varchar字段的字节数将所述varchar字段存储在所述数据行中,或者,存储在所述数据行及内存溢出页面中。

结合第二方面,在第二方面第一实施方式中,各所述varchar字段的内存溢出页面并不共用。

结合第二方面或第二方面第一实施方式,在第二方面第二实施方式中,所述内存溢出页面中的各溢出字段,使用至多一溢出行。

结合第二方面,在第二方面第三实施方式中,所述字段数据存储模块包括:第一字段存储子模块,用于当所述varchar字段的字节数小于所述数据行的字节限值时,将所述数据行中的第1个字节存储所述varchar字段的长度,所述数据行的其他空间用于存储所述varchar字段的字符串。

结合第二方面,在第二方面第四实施方式中,所述字段数据存储模块还包括:第二字段存储子模块,用于当所述varchar字段的字节数大于或等于所述数据行的字节限值时,将所述数据行的前2个字节用于存储所述varchar字段的长度,后4个字节用于存储表示溢出字段的页号及表示溢出字段的行号,并将所述varchar字段对应的内存溢出页划分为多组不同类型的溢出页,分别用于存储所述varchar字段的字符串。

结合第二方面第四实施方式,在第二方面第五实施方式中,每组不同类型的溢出页的数据行长度不相等。

根据第三方面,本发明实施例提供了一种电子设备/移动终端/服务器,包括:存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器中存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行第一方面或者第一方面的任意一种实施方式中所述的内存数据库varchar字段的存储方法。

根据第四方面,本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行第一方面或者第一方面的任意一种实施方式中所述的内存数据库varchar字段的存储方法。

本发明实施例具备的有益效果在于,使内存数据库中数据行的长度固定,使用数据行上的固定长度字段+某个溢出页上的一行来存储varchar字段的全部数据,表上不同的varchar字段,有一组不同行长度的溢出页,在保持对数据行访问性能、内存数据库并发性影响较小的情况下,内存占用也较小,综合性能较好。

附图说明

通过参考附图会更加清楚的理解本发明的特征和优点,附图是示意性的而不应理解为对本发明进行任何限制,在附图中:

图1示出了本发明实施例的内存数据库varchar字段的存储方法的流程图;

图2示出了本发明实施例的内存数据库varchar字段的存储装置的结构示意图;

图3示出了本发明实施例的计算机设备的结构框图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明实施例提供一种内存数据库varchar字段的存储方法,如图1所示,该内存数据库varchar字段的存储方法主要包括:

步骤s1:在内存数据库中构建多行长度固定的数据行,各数据行分别用以存储一varchar字段;

步骤s2:分别为各varchar字段配置内存溢出页面;

在内存数据库中,数据行的长度固定,各数据行分别用以存储一varchar字段,则该varchar字段在数据行上占有固定的长度,并且,为每个varchar(n)字段配置相应的内存溢出页面,且不与其它varchar字段共用内存溢出页面,每个溢出字段,最多只会使用到一个溢出行,这样最多只会有一次额外的寻址,提高数据行的访问效率。

步骤s3:根据各varchar字段的字节数将varchar字段存储在数据行中,或者,存储在数据行及内存溢出页面中。

通过本发明实施例的内存数据库varchar字段的存储方法,使内存数据库中数据行的长度固定,使用数据行上的固定长度字段+某个溢出页上的一行来存储varchar字段的全部数据,表上不同的varchar字段,有一组不同行长度的溢出页,在保持对数据行访问性能、内存数据库并发性影响较小的情况下,内存占用也较小,综合性能较好。

可选地,在本发明的一些实施例中,上述步骤s3,根据各所述varchar字段的字节数将所述varchar字段存储在所述数据行中,具体包括:

当varchar字段的字节数小于数据行的字节限值时,将数据行中的第1个字节存储varchar字段的长度,数据行的其他空间用于存储varchar字段的字符串。对于含有varchar字段的表,每个varchar字段固定分配255个字节,对于varchar(n),如果n<255,直接存储在表中的数据行上,前面1个字节用于存储varchar字段的实际的长度,最多可以存储长度为254的字符串。比如varchar(200),则直接存储在数据行上,牺牲一点空间提高数据行的访问性能,不需要再去其它地方寻址取数据。

可选地,在本发明的一些实施例中,上述步骤s3,根据各所述varchar字段的字节数将所述varchar字段存储在所述数据行中,还包括:

当varchar字段的字节数大于或等于数据行的字节限值时,将数据行的前2个字节用于存储varchar字段的长度,后4个字节用于存储表示溢出字段的页号及表示溢出字段的行号,并将varchar字段对应的内存溢出页划分为多组不同类型的溢出页,分别用于存储varchar字段的字符串。

如果n>=255,数据行上的前2个字节存储varchar字段的实际长度,后4个字节内容为:(2个字节表示溢出字段的页号+2个字节表示溢出字段的行号),同时将该varchar字段的内存溢出页面划分为k组不同类型的溢出页,每组溢出页内部的数据行长度不等,如对于varchar(1249),数据行上最多存储249个字节的内容,溢出页的行上最多需要存储长度为1000个字节的内容;如果实际的字符串长度为250,溢出页的行上只需存储1个字节的长度,此时浪费较大。为减少浪费,可分为5组类型的溢出页,且长度各不相同:

第1组溢出页:行长度为200,存储实际溢出长度为1~200的字段;

第2组溢出页:行长度为400,存储实际溢出长度为201~400的字段;

第3组溢出页:行长度为600,存储实际溢出长度为401~600的字段;

第4组溢出页:行长度为800,存储实际溢出长度为601~800的字段;

第5组溢出页:行长度为1000,存储实际溢出长度为801~1000的字段。

根据varchar字段的实际长度超出数据行的部分的长度,划分多组长度不同的溢出页,从而合理分配存储空间,避免出现上述的较大空间溢出页中仅存储1-2字节内容的情况,减少每个溢出行上的空间浪费。并且,通过上述的划分,使得每个溢出字段只溢出到固定的一行,减少获取数据行内容时的寻址,提高数据处理效率。

需要说明的是,上述实施例中所提及的255字节作为数据行的字节限值、以及行长度的划分区间均为举例说明,并非用以限制本发明。

本发明实施例还提供一种内存数据库varchar字段的存储装置,如图2所示,该内存数据库varchar字段的存储装置包括:数据行构建模块1、溢出页面配置模块2及字段数据存储模块3。

上述数据行构建模块1用于在内存数据库中构建多行长度固定的数据行,各数据行分别用以存储一varchar字段;溢出页面配置模块2用于分别为各varchar字段配置内存溢出页面;详细内容可参见上述方法实施例的步骤s1及步骤s2的相关描述。

字段数据存储模块3用于根据各varchar字段的字节数将varchar字段存储在数据行中,或者,存储在数据行及内存溢出页面中;详细内容可参见上述方法实施例的步骤s3的相关描述。

通过本发明实施例的内存数据库varchar字段的存储装置,使内存数据库中数据行的长度固定,使用数据行上的固定长度字段+某个溢出页上的一行来存储varchar字段的全部数据,表上不同的varchar字段,有一组不同行长度的溢出页,在保持对数据行访问性能、内存数据库并发性影响较小的情况下,内存占用也较小,综合性能较好。

可选地,在本发明的一些实施例中,上述字段数据存储模块3具体包括:

第一字段存储子模块,用于当varchar字段的字节数小于数据行的字节限值时,将数据行中的第1个字节存储varchar字段的长度,数据行的其他空间用于存储varchar字段的字符串。具体地,对于含有varchar字段的表,每个varchar字段固定分配255个字节,对于varchar(n),如果n<255,直接存储在表中的数据行上,前面1个字节用于存储varchar字段的实际的长度,最多可以存储长度为254的字符串。比如varchar(200),则直接存储在数据行上,牺牲一点空间提高数据行的访问性能,不需要再去其它地方寻址取数据。

可选地,在本发明的一些实施例中,上述字段数据存储模块3还包括:

第二字段存储子模块,用于当varchar字段的字节数大于或等于数据行的字节限值时,将数据行的前2个字节用于存储varchar字段的长度,后4个字节用于存储表示溢出字段的页号及表示溢出字段的行号,并将varchar字段对应的内存溢出页划分为多组不同类型的溢出页,分别用于存储varchar字段的字符串。

具体地,如果n>=255,数据行上的前2个字节存储varchar字段的实际长度,后4个字节内容为:(2个字节表示溢出字段的页号+2个字节表示溢出字段的行号),同时将该varchar字段的内存溢出页面划分为k组不同类型的溢出页,每组溢出页内部的数据行长度不等,如对于varchar(1249),数据行上最多存储249个字节的内容,溢出页的行上最多需要存储长度为1000个字节的内容;如果实际的字符串长度为250,溢出页的行上只需存储1个字节的长度,此时浪费较大。为减少浪费,可分为5组类型的溢出页,且长度各不相同:

第1组溢出页:行长度为200,存储实际溢出长度为1~200的字段;

第2组溢出页:行长度为400,存储实际溢出长度为201~400的字段;

第3组溢出页:行长度为600,存储实际溢出长度为401~600的字段;

第4组溢出页:行长度为800,存储实际溢出长度为601~800的字段;

第5组溢出页:行长度为1000,存储实际溢出长度为801~1000的字段。

根据varchar字段的实际长度超出数据行的部分的长度,划分多组长度不同的溢出页,从而合理分配存储空间,避免出现上述的较大空间溢出页中仅存储1-2字节内容的情况,减少每个溢出行上的空间浪费。并且,通过上述的划分,使得每个溢出字段只溢出到固定的一行,减少获取数据行内容时的寻址,提高数据处理效率。

需要说明的是,上述实施例中所提及的255字节作为数据行的字节限值、以及行长度的划分区间均为举例说明,并非用以限制本发明。

本发明实施例还提供了一种计算机设备,如图3所示,该计算机设备可以包括处理器31和存储器32,其中处理器31和存储器32可以通过总线或者其他方式连接,图3中以通过总线连接为例。

处理器31可以为中央处理器(centralprocessingunit,cpu)。处理器31还可以为其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。

存储器32作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序、非暂态计算机可执行程序以及模块,如本发明实施例中的内存数据库varchar字段的存储方法对应的程序指令/模块(例如,图2所示的数据行构建模块1、溢出页面配置模块2及字段数据存储模块3)。处理器31通过运行存储在存储器32中的非暂态软件程序、指令以及模块,从而执行处理器的各种功能应用以及数据处理,即实现上述方法实施例中的内存数据库varchar字段的存储方法。

存储器32可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储处理器31所创建的数据等。此外,存储器32可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施例中,存储器32可选包括相对于处理器31远程设置的存储器,这些远程存储器可以通过网络连接至处理器31。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

所述一个或者多个模块存储在所述存储器32中,当被所述处理器31执行时,执行如图1所示实施例中的内存数据库varchar字段的存储方法。

上述计算机设备具体细节可以对应参阅图1至图2所示的实施例中对应的相关描述和效果进行理解,此处不再赘述。

本领域技术人员可以理解,实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)、随机存储记忆体(randomaccessmemory,ram)、快闪存储器(flashmemory)、硬盘(harddiskdrive,缩写:hdd)或固态硬盘(solid-statedrive,ssd)等;所述存储介质还可以包括上述种类的存储器的组合。

虽然结合附图描述了本发明的实施例,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下作出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1