一种内存数据库的hash索引构建方法及装置与流程

文档序号:17926112发布日期:2019-06-15 00:25阅读:183来源:国知局
本发明涉及数据处理
技术领域
:,具体涉及一种内存数据库的hash索引构建方法及装置。
背景技术
::现有技术在内存数据库中实现hash索引时,hash桶下的元素节点多为单向或者双向链表,数据行上某一个或者某几个字段的索引,是根据这些字段值,通过hash函数进行运算,映射到某个hash桶下。hash桶下的元素节点,存储了数据行的行号,当使用select*fromtablewherea=value;进行查询时,先根据value计算hash值,算出在第几个hash桶,然后遍历hash桶下的元素,根据存储的行号,取出每一行a这一列存储的值,与value进行比对,若完全相等,则就是要找的行。以hash桶下的节点为双向链表举例,桶下的元素节点结构为:对于内存数据库里的某张表,假设表总共有m行,表上有n个hash索引,则这张表就有n套hash结构,每套hash结构有m个桶节点,以上述双向链表为例,这张表的hash索引占用的内存为n*(hash索引头节点占用内存+m*24字节),在n较大时,内存占用非常明显。24个字节有时甚至比数据表中这行数据本身占用的内存还要大。技术实现要素:有鉴于此,本发明实施例提供了一种内存数据库的hash索引构建方法及装置,以解决现有的hash索引数据结构内存占用较大的问题。根据第一方面,本发明实施例提供了一种内存数据库的hash索引构建方法,包括:获取内存数据库中的数据链表的行数;根据所述行数分配用于hash索引的桶节点数组中的桶节点个数,并记录各个所述桶节点数组的头节点;根据所述桶节点个数及头节点构建用于模拟所述数据链表的数组元素。结合第一方面,在第一方面第一实施方式中,根据所述桶节点个数及头节点构建用于模拟所述数据链表的数组元素,包括:根据所述数据链表中的数据行数与hash桶的映射关系,将所述hash桶指向对应映射的数据链表中的行。结合第一方面第一实施方式,在第一方面第二实施方式中,根据所述桶节点个数及头节点构建用于模拟所述数据链表的数组元素,还包括:按照所述内存数据库中的数据链表的行序号,为所述数组元素设置下标。结合第一方面,在第一方面第三实施方式中,该内存数据库的hash索引构建方法还包括:判断所述数据链表的行数是否发生变化;如果所述数据链表的行数发生变化,根据所述数据链表的行数变化对应修改所述桶节点数组的数组元素。根据第二方面,本发明实施例提供了一种内存数据库的hash索引构建装置,包括:数据行数获取模块,用于获取内存数据库中的数据链表的行数;桶节点分配模块,用于根据所述行数分配用于hash索引的桶节点数组中的桶节点个数,并记录各个所述桶节点数组的头节点;数据元素构建模块,用于根据所述桶节点个数及头节点构建用于模拟所述数据链表的数组元素。结合第二方面,在第二方面第一实施方式中,所述数据元素构建模块包括:数据元素构建子模块,用于根据所述数据链表中的数据行数与hash桶的映射关系,将所述hash桶指向对应映射的数据链表中的行。结合第二方面第一实施方式,在第二方面第二实施方式中,所述数据元素构建模块还包括:下标配置子模块,用于按照所述内存数据库中的数据链表的行序号,为所述数组元素设置下标。结合第二方面,在第二方面第三实施方式中,该内存数据库的hash索引构建装置还包括:行数判断模块,用于判断所述数据链表的行数是否发生变化;如果所述数据链表的行数发生变化,所述数据元素构建子模块还用于根据所述数据链表的行数变化对应修改所述桶节点数组的数组元素。根据第三方面,本发明实施例提供了一种电子设备/移动终端/服务器,包括:存储器和处理器,所述存储器和所述处理器之间互相通信连接,所述存储器中存储有计算机指令,所述处理器通过执行所述计算机指令,从而执行第一方面或者第一方面的任意一种实施方式中所述的内存数据库的hash索引构建方法。根据第四方面,本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行第一方面或者第一方面的任意一种实施方式中所述的内存数据库的hash索引构建方法。本发明实施例的内存数据库的hash索引构建方法及装置,所具备的有益效果在于,基于使用数组元素来模拟链表节点,且不再额外分配空间存储链表节点的值,空间占用小;数组元素一次性分配,内存连续,访问速度快,效率不受影响。附图说明通过参考附图会更加清楚的理解本发明的特征和优点,附图是示意性的而不应理解为对本发明进行任何限制,在附图中:图1示出了本发明实施例的内存数据库的hash索引构建方法的流程图;图2示出了本发明实施例的内存数据库的hash索引构建装置的结构示意图;图3示出了本发明实施例的计算机设备的结构框图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。本发明实施例提供一种内存数据库的hash索引构建方法,如图1所示,该内存数据库的hash索引构建方法主要包括:步骤s1:获取内存数据库中的数据链表的行数;步骤s2:根据行数分配用于hash索引的桶节点数组中的桶节点个数,并记录各个桶节点数组的头节点;对于内存数据库中的数据链表,获取其预分配n行行数,对应地,hash索引的桶节点数组预分配n个元素,即一个array_nodearray_node_0[n]的数组,并记录每个桶的头节点。步骤s3:根据桶节点个数及头节点构建用于模拟数据链表的数组元素。假设单向链表、双向链表的节点值,是一个从0开始的连续的非负整数集合,且各个链表节点的值各不相同,本发明实施例中,可以通过连续的数组进行模拟,且节点元素不需要存储节点值,从而减少链表元素的内存占用。由于数组一次性分配,每一组位于连续内存空间,访问上一个、下一个元素节点的效率不会下降。本发明实施例的内存数据库的hash索引构建方法,基于使用数组元素来模拟链表节点,且不再额外分配空间存储链表节点的值,空间占用小;数组元素一次性分配,内存连续,访问速度快,效率不受影响。可选地,在本发明实施例中,上述的步骤s3,根据桶节点个数及头节点构建用于模拟数据链表的数组元素,具体包括:根据数据链表中的数据行数与hash桶的映射关系,将hash桶指向对应映射的数据链表中的行。例如,对于某个hash索引,数据链表的第3行,第29行,第36815行都映射到桶2下,则桶2的头节点指向array_node[3]。通过数组来模拟链表,内存占用减少1/3,并且数组的内存是一次性分配出来,内存连续,访问速度快。可选地,在本发明的一些实施例中,步骤s3,根据所述桶节点个数及头节点构建用于模拟所述数据链表的数组元素,还包括:按照内存数据库中的数据链表的行序号,为数组元素设置下标。对于某张有n行的数据链表,申请分配数组空间array_node[n],对于数组中的某个元素array_node[k],其下标k有两个含义,一个是数组中的下标,用于访问array_node[k].prev_oid和array_node[k].next_oid;另一个含义是array_node[k]指向内存数据库此表中的第k行,从而可以去访问这张表中的第k行上的内容。这样就避免存储mint8oid;//数据行行号,可节省1/3的内存空间;如果hash桶下的节点是单向链表,则可节省1/2的内存。可选地,在本发明的一些实施例中,该还包括:判断数据链表的行数是否发生变化;如果数据链表的行数发生变化,根据数据链表的行数变化对应修改桶节点数组的数组元素。如果数据链表进行了扩表,比如表由n行变为了2n行,hash索引的桶节点数组也进行相应的扩展,再新建一个array_nodearray_node_1[n],如果访问第(n+5)行,取模,(n+5)/n=1知道要去array_node_1上访问第5个节点,并且,扩表也不会涉及内存的拷贝,不影响访问效率。以下结合一具体示例对本发明实施例的内存数据库的hash索引构建方法作进一步说明。通过上述步骤s1-步骤s3,构建的数组元素的架构为:}总共8+8=16个字节,如果oid为0,则代表上一个、下一个桶节点为空,即本节点的前面或者后面没有其它桶节点。数据表预分配n行,hash索引的桶节点数组也预分配n个元素,即一个array_nodearray_node_0[n]的数组,记录每个桶的头节点。假设对于某个hash索引,数据表的第3行,第29行,第36815行都映射到桶2下,则桶2的头结点指向array_node[3],array_node_0[3]->prev_oid=0,array_node_0[3]->next_oid=29;array_node_0[29]->prev_oid=3,array_node_0[29]->next_oid=36815;array_node_0[36815]->prev_oid=29,array_node_0[36815]->next_oid=0;这样,同样做到了前后的遍历(next_oid=0表示这是链表上的最后一个有效元素),通过数组来模拟链表,内存占用减少1/3,并且数组的内存是一次性分配出来,内存连续,访问速度快。本发明实施例还提供一种内存数据库的hash索引构建装置,如图2所示,该内存数据库的hash索引构建装置包括:数据行数获取模块1、桶节点分配模块2及数据元素构建模块3等。其中,该数据行数获取模块1用于获取内存数据库中的数据链表的行数;详细内容可参见上述方法实施例的步骤s1的相关描述。桶节点分配模块2用于根据所述行数分配用于hash索引的桶节点数组中的桶节点个数,并记录各个所述桶节点数组的头节点;详细内容可参见上述方法实施例的步骤s1的相关描述。数据元素构建模块3用于根据所述桶节点个数及头节点构建用于模拟所述数据链表的数组元素,详细内容可参见上述方法实施例的步骤s1的相关描述。本发明实施例的内存数据库的hash索引构建装置,基于使用数组元素来模拟链表节点,且不再额外分配空间存储链表节点的值,空间占用小;用数组下标来表达节点值的含义,减少链表元素的内存占用;数组元素一次性分配,内存连续,访问速度快,效率不受影响。可选地,在本发明的一些实施例中,数据元素构建模块3包括:数据元素构建子模块,用于根据数据链表中的数据行数与hash桶的映射关系,将hash桶指向对应映射的数据链表中的行。可选地,在本发明的一些实施例中,数据元素构建模块3还包括:下标配置子模块,用于按照内存数据库中的数据链表的行序号,为数组元素设置下标。可选地,在本发明的一些实施例中,该内存数据库的hash索引构建装置还包括:行数判断模块,用于判断数据链表的行数是否发生变化;如果数据链表的行数发生变化,数据元素构建子模块还用于根据数据链表的行数变化对应修改桶节点数组的数组元素。本发明实施例还提供了一种计算机设备,如图3所示,该计算机设备可以包括处理器31和存储器32,其中处理器31和存储器32可以通过总线或者其他方式连接,图3中以通过总线连接为例。处理器31可以为中央处理器(centralprocessingunit,cpu)。处理器31还可以为其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。存储器32作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序、非暂态计算机可执行程序以及模块,如本发明实施例中的内存数据库的hash索引构建方法对应的程序指令/模块(例如,图2所示的数据行数获取模块1、桶节点分配模块2及数据元素构建模块3)。处理器31通过运行存储在存储器32中的非暂态软件程序、指令以及模块,从而执行处理器的各种功能应用以及数据处理,即实现上述方法实施例中的内存数据库的hash索引构建方法。存储器32可以包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需要的应用程序;存储数据区可存储处理器31所创建的数据等。此外,存储器32可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施例中,存储器32可选包括相对于处理器31远程设置的存储器,这些远程存储器可以通过网络连接至处理器31。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。所述一个或者多个模块存储在所述存储器32中,当被所述处理器31执行时,执行如图1所示实施例中的内存数据库的hash索引构建方法。上述计算机设备具体细节可以对应参阅图1至图2所示的实施例中对应的相关描述和效果进行理解,此处不再赘述。本领域技术人员可以理解,实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)、随机存储记忆体(randomaccessmemory,ram)、快闪存储器(flashmemory)、硬盘(harddiskdrive,缩写:hdd)或固态硬盘(solid-statedrive,ssd)等;所述存储介质还可以包括上述种类的存储器的组合。虽然结合附图描述了本发明的实施例,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下作出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1