一种高性能的内存数据库索引组织与访问方法

文档序号:10612907阅读:707来源:国知局
一种高性能的内存数据库索引组织与访问方法
【专利摘要】本发明公开了一种高性能的内存数据库索引组织与访问方法,首先整体的索引表结构分级组织;然后在系统的虚拟地址空间中为每级桶链表分配一个连续的虚拟地址空间;将各个桶链表映射到对应的虚拟地址空间;最后采用链表的方式组织各级索引结构中的索引及数据,链表中的每一项为一个桶组织,每个桶组织中存放有该桶组织自身的属性信息,与指向下一个桶组织的指针以及索引项信息。本发明提出的数据库索引组织结构,插入或删除数据时不需要对数据进行排序;VAB桶中的元素是无序存储,可通过位图来标识数据,不需要树结构那样为了维持内部元素的有序而每次插入或删除一个数据的时候都要进行排序,从而减少大量写NVM的次数。
【专利说明】
一种高性能的内存数据库索引组织与访问方法
技术领域
[0001] 本发明涉及数据库领域,特别是一种高性能的内存数据库索引组织与访问方法。
【背景技术】
[0002] 随着计算机硬件技术的发展,内存的价格不断降低,内存容量越来越大,将数据库 中全部或者部分数据存入内存中是完全可行。但是,传统的DRAM内存在掉电后不能保持数 据,因此不具备数据存储功能。
[0003] 近年来,出现了一种新型的存储器,即非易失性存储器(NVM)。该存储器的主要特 点有:存储于NVM的数据不会因为掉电或者系统崩溃而丢失,其储容量可接近磁盘,NVM具有 接近DRAM的读写速度。此外,非易失性存储器还具有高密度、低功耗、抗辐射等诸多优点。这 些优点使得NVM被公认为有可能在未来数年内替代一部分传统的DRAM内存。NVM将给传统计 算机内存增加数据存储的功能。这种NVM+DRAM的混合型内存在未来将成为高速数据存储系 统架构的核心。
[0004] 由于磁盘和内存在存储介质、存储方式和访问性能上存在巨大的差异,适用于磁 盘的传统数据库索引并不适用于真正存储于内存的新型内存数据库,简单复制磁盘数据库 索引的组织和访问方法将导致巨大的、不必要的系统开销,阻碍内存数据库系统的性能提 升。同时,NVM的每个存储单元的使用寿命是有限的,当NVM的存储单元的擦写次数超过一个 范围时,将可能导致其无法正确的存储数据。为了延长NVM内存的使用寿命,内存数据库的 索引要尽可能地减少对NVM的写操作次数。因此,我们在本发明中提出一套全新的、适用于 非易失性存储器的内存数据库索引组织与访问方法。
[0005] 目前,在现有技术中,常用树型结构作为数据库的索引结构,比如B+Tree、T-tree。 下面以B+Tree为例具体介绍其作为数据库索引的方案。B+Tree的总体结构如图1,节点分为 三种:根节点,非叶子节点和叶节点。节点内部可以存放多个元素,并且按照从小到大的顺 序有序存储。除此之外,还包含多个指针,比如指向节点的父节点的指针、指向孩子节点(对 于叶节点来说,指向的是数据存储的地方)的指针、还有叶子节点独有的指向其兄弟节点的 指针,如表1、表2。叶子节点存放索引的关键字以及对应的指向数据的指针,根节点和叶节 点只存储索引关键字。底层叶节点用指针首尾相连,有利于对叶节点的遍历操作。
[0006] 对于m-n阶B+Tree来说,需要满足的特性有:
[0007] (1)根节点是一个叶子结点或者是一个有2至m个孩子的非叶子结点;(2)内部结点 有m/2至m个孩子,拥有的关键字数比拥有的孩子数少一;(3)叶节点有n/2至η个孩子,孩子 指向实际的数据;(4)叶节点具有相同的尚度;(5)所有结点存储的关键字是有序排列的;如 图 1所不的B+Tree中,m = 3,η = 4,即 3-4 阶 B+Tree。
[0008] 表1是B+Tree内部节点和根节点内部信息示意表,其中kl、k2......kn表示索引的关 键字,chO、chi......chn表示指向孩子的指针,num表示节点中元素个数:
[0009] 表lB+Tree内部节点及根节点
[0010]
[0011] 表2是B+Tree叶子节内部信息示意表,h、k2……kn表示关键字,Pl、p 2……pn表示指 向数据的指针,num表示节点中元素个数:
[0012] 表2B+Tree叶子节点:
[0013]
[0014]~B+Tree作为NVM内存数据库索引主要有以下几个缺点: ' '
[0015] (1)基于B+Tree的数据库索引在插入、删除操作中会引起大量针对NVM的写操作。 因为内部索引节点和叶子节点中的数据都是根据关键字有序存放。不论是插入还是删除操 作,只要需要改变节点中的存储信息,就需要重新调整数据的存放位置。调整位置的过程就 会产生大量写NVM的操作。
[0016] (2)插入删除操作不光会导致更新信息的节点产生写NVM的操作,还会影响到其他 节点。因为在插入删除时会引起节点的分裂或者合并操作,从而导致为了维护树的特性要 大范围进行调平衡操作,这些操作会对当前节点的兄弟节点和父节点中存储的信息进行更 改。更改信息的过程会产生大量的写操作。
[0017] (3)在范围查找时,B+Tree要逐个对叶节点进行访问查找,会显著的降低B+Tree的 性能。因为B+Tree将全部的数据存放在叶节点中,并且叶节点的虚拟地址是离散的,所以在 范围查找时,要逐个将满足查找范围的叶节点拷贝至内存中,不能利用连续的虚拟地址将 所有符合的叶节点一次全部拷贝到内存。
[0018] (4)在内存中,为了提高缓存命中率,节点相对较小,因此树的高度很高,会导致B+ Tree频繁的调整树的结构。调整结构就会带来大量的写NVM的操作。
[0019] 不论是传统的B+Tree还是τ-tree等树结构,为了维护其节点内部的有序性和树的 平衡性,都需要经常做出调整,从而会有大量的NVM写操作,减少其寿命。
[0020] 因此,需要一种高性能的内存数据库索引组织与访问方法。

【发明内容】

[0021] 本发明的目的是提出一种高性能的内存数据库索引组织与访问方法。
[0022] 本发明的目的是通过以下技术方案来实现的:
[0023] 本发明提供的高性能的内存数据库索引组织与访问方法,包括以下步骤:
[0024] S1.整体的索引表结构分级组织;
[0025] S2.在系统的虚拟地址空间中为每级桶链表分配一个连续的虚拟地址空间;
[0026] S3.将各个桶链表映射到对应的虚拟地址空间;
[0027] S4.采用链表的方式组织各级索引结构中的索引及数据,链表中的每一项为一个 桶组织,每个桶组织中存放有该桶组织自身的属性信息,与指向下一个桶组织的指针以及 索引项信息。
[0028] 进一步,所述步骤S2中的桶链表为单级或多级。
[0029] 进一步,所述步骤S2中所述每级桶链表映射到连续或离散的虚拟地址空间中。
[0030] 进一步,所述步骤S4中用链表、数组或其他结构组织桶,所述组织桶中存放的属性 信息包括存放在该桶中的元素的最小值、最大值、个数和每个元素的标识信息。
[0031] 进一步,还包括数据库索引离线构建,所述数据库索引离线构建的具体步骤如下:
[0032] S11.第一次为数据库构建索引表时,数据库中已经存有数据。首先扫描将要存储 到数据库中的数据。
[0033] S12.根据数据库中已有的数据,选出划分索引的分界值。
[0034] S13.计算S12中选出的分界值之间的间距的平均值。选用该平均值作为桶中最大 值与最小值的差值。
[0035] S14:按照S13得到的差值,建立一级表和二级表,然后将数据逐条插入表中。
[0036] 进一步,所述步骤S12中在选择划分索引的分界值时,可以用选取中间值等方法确 定分界值。
[0037] 进一步,还包括内存数据库索引的插入方法,具体步骤如下:
[0038] S21.接收插入请求,读入待插入的数据。
[0039] S22.使用连续的虚拟地址或者使用顺序查找确定用于存放待插入数据的桶。
[0040] S23.当S22中找到的桶未满时,直接把待插入数据存放到桶的第一个空位。否则执 行S4。
[0041 ] S24.创建一个新的桶,从原桶内的数据选出中位数(记为mid),设置新桶的最小值 为mid,最大值为原桶的最大值,然后修改原桶的最大值为mid。之后将原桶中大于mid的数 据复制到新桶中,同时修改原桶和新桶的位图以达到一致的效果。最后将新建的桶插入到 二级表中。
[0042]进一步,还包括内存数据库索引的删除,所述内存数据库索引的删除具体步骤如 下:
[0043] S31.接收删除请求,读入待删除的数据。
[0044] S32.使用连续的虚拟地址空间或者使用顺序查找找到存放待删除数据的桶。
[0045] S33.在S32中所找到的桶中,把存放待删除数据的位置标记为空闲位置。
[0046] 进一步,还包括内存数据库索引的查找,所述内存数据库索引的查找具体步骤如 下:
[0047] S41.接收查找请求,读入待查找的数据。
[0048] S42.使用连续的虚拟地址或者使用顺序查找获得待查找的数据所在的桶。
[0049] S43.在S42中所找到的桶中,搜索待查找的数据,并返回搜索到的数据。
[0050] 进一步,还包括内存数据库索引的范围查找,所述内存数据库索引的范围查找具 体步骤如下:
[0051] S51.接收范围查找请求,读入查找范围的起始值和终止值。
[0052] S52.使用连续的虚拟地址在最高级表中查找该范围的起始值和终止值所在的桶 的位置。
[0053] S53.利用虚拟地址空间连续性的特性,将S52中找到的所有桶一次性拷贝到内存 中。
[0054] S54.在内存中查找桶中大于等于范围查找的起始值并小于等于终止值的数据。
[0055] S55.使用顺序查找依次在其他低级表中查找范围起始值所在的桶的位置。
[0056] S56.从起始值所对应的桶的位置开始,按照顺序依次将找到的桶中满足条件的数 据拷贝至内存,直到遇到大于终止值的数据时结束查找。
[0057]由于采用了上述技术方案,本发明具有如下的优点:
[0058]本发明提出的数据库索引组织结构,能最大程度的减少NVM擦写次数,使用VAB管 理数据时,插入或删除数据时不需要对数据进行排序。VAB桶中的元素是无序存储的,可以 通过位图来标识数据,并不需要像B-Tree等树结构那样为了维持内部元素的有序而每次插 入或删除一个数据的时候都要进行排序,从而减少大量写NVM的次数。
[0059] VAB的结构稳定,不需要经常进行调整;VAB的桶链表组织方式使得VAB结构稳定, 不需要像树结构那样经常进行调平衡的操作,从而大量地减少写NVM的次数。
[0060] 使用连续的虚拟地址空间和硬件MMU访问索引;使用连续的虚拟地址空间组织索 弓丨。在访问索引的时候,利用CHJ自带的硬件MMU和索引的虚拟地址定位索引的物理位置,从 而避免了软件搜索索引的物理位置的开销,使得访问索引的速度更快。对于单元素查找,可 以在桶链表所形成的连续的虚拟地址上使用二分法快速查找。范围查找时只需先在桶链表 形成的虚拟地址上进行二分法快速定位到起始地址以及终止地址,然后一次性连续地读取 该段虚拟地址。这种方式充分利用了 MMU,并不像传统的树结构那样多次重复读取一个指 针,然后找到节点的位置,拷贝数据到内存。与树结构相比,VAB节省了大量指针访问和数据 拷贝的时间。
[0061]本发明的其他优点、目标和特征在某种程度上将在随后的说明书中进行阐述,并 且在某种程度上,基于对下文的考察研究对本领域技术人员而言将是显而易见的,或者可 以从本发明的实践中得到教导。本发明的目标和其他优点可以通过下面的说明书来实现和 获得。
【附图说明】
[0062]本发明的【附图说明】如下。
[0063] 图1为B+Tree不意图。
[0064] 图2为索引存储于NVM介质的体系结构。
[0065]图3为数据库应用软件上下文。
[0066]图4为本发明的一级表整体结构。
[0067]图5为本发明的二级表结构图。
[0068]图6为本发明的VAB查找操作流程。
[0069]图7为本发明的VAB插入操作流程。
[0070]图8为本发明的VAB删除操作流程。
[0071]图9为本发明的VAB范围查找流程。
【具体实施方式】
[0072]下面结合附图和实施例对本发明作进一步说明。
[0073] 实施例1
[0074] 本实施例提供的缩略语和关键术语定义如下所述:NVM:Non-Volatile Memory,非 易失性存储器;MMU:Memory Management Unit,存储管理单元;VAB:Virtual Address Bucket,虚拟地址桶;
[0075]如图所示,本实施例提供的高性能的内存数据库索引组织与访问方法,包括以下 步骤:
[0076] S1.整体的索引表结构分级组织;
[0077] S2.在系统的虚拟地址空间中为每级桶链表分配一个连续的虚拟地址空间;
[0078] S3.将各个桶链表映射到对应的虚拟地址空间;
[0079] S4.采用链表的方式组织各级索引结构中的索引及数据,链表中的每一项为一个 桶组织,每个桶组织中存放有该桶组织自身的属性信息,与指向下一个桶组织的指针以及 索引项信息。
[0080] 所述步骤S2中的桶链表为单级或多级。
[0081 ]所述步骤S2中所述每级桶链表映射到连续或离散的虚拟地址空间中。
[0082]所述步骤S4中用链表、数组或其他结构组织桶,所述组织桶中存放的属性信息包 括存放在该桶中的元素的最小值、最大值、个数和每个元素的标识信息。
[0083] 还包括数据库索引离线构建,所述数据库索引离线构建的具体步骤如下:
[0084] S11.第一次为数据库构建索引表时,数据库中已经存有数据。首先扫描将要存储 到数据库中的数据。
[0085] S12.根据数据库中已有的数据,选出划分索引的分界值。
[0086] S13.计算S12中选出的分界值之间的间距的平均值。选用该平均值作为桶中最大 值与最小值的差值。
[0087] S14:按照S13得到的差值,建立一级表和二级表,然后将数据逐条插入表中。
[0088] 所述步骤S12中在选择划分索引的分界值时,可以用选取中间值等方法确定分界 值。
[0089] 还包括内存数据库索引的插入方法,具体步骤如下:
[0090] S21.接收插入请求,读入待插入的数据。
[0091] S22.使用连续的虚拟地址或者使用顺序查找确定用于存放待插入数据的桶。
[0092] S23.当S22中找到的桶未满时,直接把待插入数据存放到桶的第一个空位。否则执 行S4。
[0093] S24.创建一个新的桶,从原桶内的数据选出中位数(记为mid),设置新桶的最小值 为mid,最大值为原桶的最大值,然后修改原桶的最大值为mid。之后将原桶中大于mid的数 据复制到新桶中,同时修改原桶和新桶的位图以达到一致的效果。最后将新建的桶插入到 二级表中。
[0094] 还包括内存数据库索引的删除,所述内存数据库索引的删除具体步骤如下:
[0095] S31.接收删除请求,读入待删除的数据。
[0096] S32.使用连续的虚拟地址空间或者使用顺序查找找到存放待删除数据的桶。
[0097] S33.在S32中所找到的桶中,把存放待删除数据的位置标记为空闲位置。
[0098] 还包括内存数据库索引的查找,所述内存数据库索引的查找具体步骤如下:
[0099] S41.接收查找请求,读入待查找的数据。
[0100] S42.使用连续的虚拟地址或者使用顺序查找获得待查找的数据所在的桶。
[0101] S43.在S42中所找到的桶中,搜索待查找的数据,并返回搜索到的数据。
[0102 ]还包括内存数据库索引的范围查找,所述内存数据库索引的范围查找具体步骤如 下:
[0103] S51.接收范围查找请求,读入查找范围的起始值和终止值。
[0104] S52.使用连续的虚拟地址在最高级表中查找该范围的起始值和终止值所在的桶 的位置。
[0105] S53.利用虚拟地址空间连续性的特性,将S52中找到的所有桶一次性拷贝到内存 中。
[0106] S54.在内存中查找桶中大于等于范围查找的起始值并小于等于终止值的数据。
[0107] S55.使用顺序查找依次在其他低级表中查找范围起始值所在的桶的位置。
[0108] S56.从起始值所对应的桶的位置开始,按照顺序依次将找到的桶中满足条件的数 据拷贝至内存,直到遇到大于终止值的数据时结束查找。
[0109] 实施例2
[0110] 本实施例提供的高性能的内存数据库索引组织与访问方法,解决传统的磁盘数据 库索引无法适用于计算机的内存管理环境,会造成巨大的、不必要的系统开销。
[0111] 本实施例提供的内存数据库索引组织形式和访问方法,完全契合于计算机内存的 环境,降低系统访问数据库索引结构的开销,极大程度地提高内存数据库性能。使得插入、 删除、查找、范围查找这些数据库基本操作在NVM内存上高效地进行。内存数据库索引的组 织和访问方式充分考虑NVM的存储特性,并尽可能地减少对NVM的写操作次数,维护NVM内存 的使用寿命。
[0112]如图2所示,在使用NVM存储介质作为存储设备的体系结构中,NVM与CPU通过内存 总线直接连接。系统中,DRAM存储器与NVM存储器处于同一个层级。此外,高速缓冲器Cache 位于CPU中。在这种场景中,数据库的索引index与记录record都存储在NVM介质上。程序代 码以及系统运行所建立的页表等结构将存储于DRAM中。而CPU在执行指令时将会首先把数 据从DRAM或NVM调入Cache,然后进行访问。
[0113] 图2为索引存储于NVM介质的体系结构,在这种场景中,索引Index的软件上下文环 境如图3所示,图3为数据库应用软件上下文;通常,数据库应用程序主要执行插入、删除、查 找以及范围查找四种操作。用户进程发出某个操作后,数据库进程通过解析器Parser进行 语句解析以及访问优化处理,然后访问存储在NVM上的Index。对于插入与删除操作,将会对 存储在NVM上的Index进行修改。对于查找与范围查找操作,将会通过Index定位到存储在 NVM上所对应的记录Record。
[0114] 1)VAB索引整体组织方式介绍
[0115] VAB索引整体结构由一级表、二级表和虚拟地址空间组成。一级表和二级表结构类 似,都是由指针所连接的桶组成,每个桶可以存放多个元素。一级表中的桶将被映射到连续 虚拟地址空间,目的是提升查找和范围查找的速度。一级表只有一个,其长度可随索引长度 增大而增大。二级表可以有一个或多个,其桶结构没有与虚拟地址进行映射,主要用于缓 冲,从而延迟一级表与虚拟地址重新映射。一级表和二级表之间是相互独立的。当需要建立 数据库索引的时候,就会对一级表,二级表进行初始化,同时分配出一级表所映射的虚拟地 址空间。当二级表的长度达到阈值,就要与一级表进行合并,此时就需要重新给一级表分配 虚拟地址空间。
[0116] 图4为一级表的整体结构不意图。链表中的每一项称之为桶,每一个桶中存放最小 值,最大值,位图,数据和指向下一个桶的指针。
[0117] (1)最小值:指的是桶中可以存放的key (键值)的最小值。
[0118] (2)最大值:指的是桶中可以存放的key的最大值。
[0119] (3)位图:位图的每一位用来指示桶中对应位置是否存有数据。
[0120] (4)桶中存放的数据是以key和record成对存在的,我们将这一对称为pair。其中 key指的是索引的键值,record是一个指向实际数据的指针。VAB索引中桶的概念与树结构 中节点的概念类似。
[0121 ] -级表应遵循的规则是:
[0122] (1)每一个桶中的最大值大于最小值。
[0123] (2)桶链表是有顺序的,后一个桶的最小值要大于等于前一个桶的最大值。
[0124] (3)桶中最多可存放的元素个数是固定的,并且其中的每一个key的值,都应该大 于等于相应的桶中指定的最小值并小于最大值。
[0125] (4)桶中的pair数据是无序、随意存放的,即不需要按照key的大小进行排序,并且 两个pair之间不一定是紧挨在一起的。
[0126] 本实施例利用了虚拟地址的特性,将桶链表的地址连续化。具体方式是:申请一段 连续的虚拟地址空间,将桶链表中每一个桶的地址映射到桶映射虚拟地址区域,下面对这 段虚拟地址区域的用途加以说明:
[0127] (1)桶映射虚拟地址区域用于提升全局查找速度
[0128] 由于一级表整体是由链表的方式将每个桶组织起来的,而且一级表的长度无限。 对于链表,其查找方式就只能顺序逐一查找,这样将大大降低查找速度。但以链表的方式组 织索引结构的好处是,由于一级表中的桶链表是有序的,在添加或删除一个第一桶的时候 只需要改动相应的指针即可,并不需要像数组一样为了维护有序性而使得插入或删除第一 桶的时候,第一桶后面的桶全部要向后移动或向前移动,这样将产生大量的NVM写操作。因 此,本发明通过将桶链表映射到虚拟地址空间,使得一级表中所有的桶的地址是连续的,进 而可以使用二分查找的方法提升桶的查找速度。
[0129] (2)桶映射虚拟地址区域用于提升范围查找速度
[0130]传统的树结构节点与节点之间是指针连接,而在范围查找的过程中会涉及到非常 多的节点,那么当客户端向服务器端数据库请求范围查找操作的时候,服务器端数据库将 重复多次执行访问指针,拷贝整个节点到客户端内存这样的操作。而VAB通过将一级表中所 有桶的地址映射到一块连续的虚拟地址空间,从而使得在执行客户端向服务器端数据库请 求范围查找的时候,可以将虚拟地址空间中的起始地址到终止地址这段范围内的数据一次 性拷贝到客户端的内存中,省去了多次的指针访问和内存拷贝的时间,从而提升了范围查 找的速度。
[0131]图4为一级表整体结构,除了一级表,VAB索引还有二级表,其结构如图5所示。二级 表的主要用来作为缓冲,由于一级表的桶链表映射到了虚拟地址区域,一旦一级表中插入 新桶,为了保持一致性,就需要重新给一级表分配虚拟地址空间。所以一级表的结构不易经 常变动。基于此,本发明设计了二级表用于缓冲,将新产生的桶插入二级表中,从而保证一 级表的稳定性。
[0132] 二级表的结构与一级表类似,整体结构也是链表,链表中每一项称之为桶,桶中存 放最小值,最大值,位图数据和指向下一个槽的指针。这里不再赘述。与一级表不同的是:其 一,一级表的长度是不受限制的,而二级表的长度是有最大限制的,当二级表达到指定的长 度就需要与一级表合并;其二,二级表没有利用虚拟地址的概念,因为二级表长度比较短, 所以按照顺序进行查找即可。注意,二级表的最大长度限制是可以随着数据库的使用情况 而动态调整的。当数据库插入操作过多时,二级表的最大长度限制会增大,这样可以减少为 一级表重新分配虚拟地址空间的操作;当数据库查询操作多时,二级表的最大长度限制会 减少,这样可以提升查询效率,即多数查询在一级表中命中。
[0133] 图5为二级表结构图,2)VAB索引的建立方式,VAB索引的建立分为以下两种情况:
[0134] 在线:当用户进程请求建立数据库索引或插入新元素时,数据库进程逐条读取索 引及其数据然后插入VAB索引表中。这种方法我们称为在线。
[0135] 离线:当用户进程请求建立数据库索引时,数据库进程首先扫描一遍数据库表中 所有要建立索引的键值,从而VAB可以根据这些键值的特点有针对性地初始化VAB索引表。 这种方法我们称为离线。
[0136] 以下分别为在线和离线建立VAB索引表的方法:
[0137] 对于离线来说,首先数据库进程扫描所有要建立索引的的键值,根据现有的键值, 确定出一个合适的key_padding(键值间隔,及每个桶中最大值与最小值之差)大小。从而使 得每个桶内的元素能够比较均匀地分布。在后续的插入操作中,也能够尽可能降低桶分裂 的次数,有效的提升性能。具体实现方法如下:首先扫描将要存储到数据库中的数据,利用 采样排序的思想选出分界值,将这些分界值之间的间距的平均值作为key_padding的大小。 按照这个key_padding,建立一级表和二级表,然后将数据逐条插入。
[0138]对于在线来说,根据系统默认的key_padding大小,建立空的一级表和二级表。然 后将数据逐条插入。
[0139 ] 3) VAB索引的查找操作,图6为VAB查找操作流程,如图6所示:
[0140]①用户进程调用数据库进程,请求执行查找操作。
[0141 ]②数据库进程读取待查找的值,准备执行查找操作。
[0142] ③数据库进程依次查找一级表和二级表,直到找到所请求的索引所在的第一桶。 在查找一级表的过程中,可以在桶链表所映射的连续虚拟地址空间中使用二分法查找,判 断待查找的数据是否大于等于该桶的最小值并小于该桶的最大值,从而快速找到一级表中 对应的第一桶。而查找二级表的过程中,则可以顺序扫描桶链表,进而找到待查找数据所对 应的第一桶。
[0143] ④若存在对应的第一桶,数据库进程扫描第一桶内的数据,判断是否存在要查找 的值。若存在,数据库进程会返回该值,表示已经查找到;否则,表明没有查找到,返回用户 空间。
[0144] 4) VAB索引的插入操作,图7为VAB插入操作流程,如图7所示:
[0145] ①用户进程调用数据库进程,请求执行插入操作。
[0146] ②数据库进程读取待插入的值,准备执行插入操作。
[0147] ③数据库进程依次查找一级表和二级表,直到确定所请求的索引所在的第一桶。 在查找一级表的过程中,可以在桶链表所映射的连续虚拟地址空间中使用二分法查找,从 而快速找到一级表中对应的第一桶。
[0148] ④若存在对应的桶,数据库进程要判断插入值是否已存在。若存在,表明索引已存 在,返回用户进程。若不存在则首先判断第一桶中的数据个数是否已经满了。
[0149] ⑤若桶中存储的元素没有满,则直接插入key和record,并将位图中对应的位置置 为1。若满了,则执行分裂操作:创建一个新的桶,从原桶内的数据选出中位数(记为mid),设 置新桶的最小值为mid,最大值为原桶的最大值,然后修改原桶的最大值为mid。之后将原桶 中大于mid的数据复制到新桶中,同时修改原桶和新桶的位图以达到一致的效果。最后将新 建的桶插入到二级表中。
[0150] ⑥若没有对应的桶,数据库进程会创建一个新桶,设置桶的最小值和最大值。将待 插入值插入到桶中,修改位图中对应的位。最后将新建的桶插入二级表中。
[0151] 5)VAB索引的删除操作,图8为VAB删除操作流程,如图8所示:
[0152] ①用户进程调用数据库进程,请求执行删除操作。
[0153] ②数据库进程读取待删除的值,准备执行删除操作。
[0154] ③数据库进程依次查找一级表和二级表,直到确定是否存在所请求的索引所在的 第一桶。在查找一级表的过程中,可以在桶链表所映射的连续虚拟地址空间中使用二分法 查找,从而快速找到一级表中对应的第一桶。
[0155] ④若存在对应的桶,数据库进程扫描桶内的数据,看是否存在待删除的值。若存 在,数据库进程会将该值对应的位图位置为〇,表示此数据已经无效;否则,表明不存在删除 的值,返回用户空间。
[0156] 6) VAB索引的范围查找操作,图9为VAB范围查找流程,如图9所示:
[0157] 若范围查找(key_l,key_r),表示查找key_l至key_r之间的所有索引值,贝lj有:
[0158] ①用户进程调用数据库进程,请求执行范围查找操作。
[0159] ②数据库进程获取边界范围值key_l和key_r,准备执行范围查找操作。
[0160] ③数据库进程在一级表中查找,若以及表中没有桶的范围在待查找的范围内,则 执行第④步。否则得到key_l和key_r所对应的桶的位置pos_l和pos_r。使用内存拷贝函数 memcpy,将pos_l和口〇8_1·之间所有桶对应的桶拷贝至内存。
[0161] ④数据库进程在二级表中顺序查找,得到key_l所对应的桶的位置pos_l。判断该 桶的最小值是否大于key_r。若最小值小于key_r,则将pos_l对应的桶拷贝至内存。查找其 中满足给定范围的元素。对p〇s_l下一个桶指向的桶进行判断并查找,依次类推。
[0162] ⑤最后内存对数据库进程拷贝到其中的数据进行排序并将最终结果输出给用户。
[0163] 本实施例对数据库索引结构的组织与访问方法进行了改进。整体的索引结构改成 桶链表式,并结合虚拟地址空间,充分利用MMU。该索引结构的组织与访问方法可以大大减 少NVM的擦写次数并有较高的操作性能。
[0164] 本实施例提供的数据库索引组织结构,最大程度的减少NVM擦写次数;
[0165] (1)使用VAB管理数据时,插入或删除数据时不需要对数据进行排序。
[0166] VAB桶中的元素是无序存储的,可以通过位图来标识数据,并不需要像B-Tree等树 结构那样为了维持内部元素的有序而每次插入或删除一个数据的时候都要进行排序,从而 减少大量写NVM的次数。
[0167] (2)VAB的结构稳定,不需要经常进行调整。
[0168] VAB的桶链表组织方式使得VAB结构稳定,不需要像树结构那样经常进行调平衡的 操作,从而大量地减少写NVM的次数。
[0169] 2.使用连续的虚拟地址空间和硬件MMU访问索引
[0170] 使用连续的虚拟地址空间组织索引。在访问索引的时候,利用CPU自带的硬件MMU 和索引的虚拟地址定位索引的物理位置,从而避免了软件搜索索引的物理位置的开销,使 得访问索引的速度更快。
[0171] 对于单元素查找,可以在桶链表所形成的连续的虚拟地址上使用二分法快速查 找。范围查找时只需先在桶链表形成的虚拟地址上进行二分法快速定位到起始地址以及终 止地址,然后一次性连续地读取该段虚拟地址。这种方式充分利用了 MMU,并不像传统的树 结构那样多次重复读取一个指针,然后找到节点的位置,拷贝数据到内存。与树结构相比, VAB节省了大量指针访问和数据拷贝的时间。
[0172] 本实施例的高性能的内存数据库索引组织与访问方法中的NVM擦写次数少:
[0173] 因为VAB桶内部的元素是无序的,插入删除操作都不需要对桶内部的元素排序。索 引中所有的桶以链表的形式连接,在合并、分裂等操作的过程中只需要修改几个指针,从而 大量减少了对NVM的擦写次数。
[0174] 本实施例的高性能的内存数据库索引组织与访问方法中的数据库操作时间短:
[0175] 因为桶内部元素无序,插入和删除操作时省去了排序的过程,查找和范围查找两 个操作既可以直接在链表上进行查找又可以采用映射到虚拟地址空间的方式进行查找。而 本发明采用后者,充分利用了 MMU的特性,从而缩短了时间。
[0176] 最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较 佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技 术方案进行修改或者等同替换,而不脱离本技术方案的宗旨和范围,其均应涵盖在本发明 的权利要求范围当中。
【主权项】
1. 一种高性能的内存数据库索引组织与访问方法,其特征在于:包括以下步骤:51. 整体的索引表结构分级组织;52. 在系统的虚拟地址空间中为每级桶链表分配一个连续的虚拟地址空间;53. 将各个桶链表映射到对应的虚拟地址空间;54. 采用链表的方式组织各级索引结构中的索引及数据,链表中的每一项为一个桶组 织,每个桶组织中存放有该桶组织自身的属性信息,与指向下一个桶组织的指针以及索引 项信息。2. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:所述步 骤S2中的桶链表为单级或多级。3. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:所述步 骤S2中所述每级桶链表映射到连续或离散的虚拟地址空间中。4. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:所述步 骤S4中用链表、数组或其他结构组织桶,所述组织桶中存放的属性信息包括存放在该桶中 的元素的最小值、最大值、个数和每个元素的标识信息。5. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括 数据库索引离线构建,所述数据库索引离线构建的具体步骤如下:511. 第一次为数据库构建索引表时,数据库中已经存有数据。首先扫描将要存储到数 据库中的数据。512. 根据数据库中已有的数据,选出划分索引的分界值。513. 计算S12中选出的分界值之间的间距的平均值。选用该平均值作为桶中最大值与 最小值的差值。 S14:按照S13得到的差值,建立一级表和二级表,然后将数据逐条插入表中。6. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:所述步 骤S12中在选择划分索引的分界值时,可以用选取中间值等方法确定分界值。7. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括 内存数据库索引的插入方法,具体步骤如下:521. 接收插入请求,读入待插入的数据。522. 使用连续的虚拟地址或者使用顺序查找确定用于存放待插入数据的桶。 S23 .当S22中找到的桶未满时,直接把待插入数据存放到桶的第一个空位。否则执行 S4〇 S24.创建一个新的桶,从原桶内的数据选出中位数(记为mid),设置新桶的最小值为 mid,最大值为原桶的最大值,然后修改原桶的最大值为mid。之后将原桶中大于mid的数据 复制到新桶中,同时修改原桶和新桶的位图以达到一致的效果。最后将新建的桶插入到二 级表中。8. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括 内存数据库索引的删除,所述内存数据库索引的删除具体步骤如下:531. 接收删除请求,读入待删除的数据。532. 使用连续的虚拟地址空间或者使用顺序查找找到存放待删除数据的桶。533. 在S32中所找到的桶中,把存放待删除数据的位置标记为空闲位置。9. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括 内存数据库索引的查找,所述内存数据库索引的查找具体步骤如下:541. 接收查找请求,读入待查找的数据。542. 使用连续的虚拟地址或者使用顺序查找获得待查找的数据所在的桶。543. 在S42中所找到的桶中,搜索待查找的数据,并返回搜索到的数据。10. 如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包 括内存数据库索引的范围查找,所述内存数据库索引的范围查找具体步骤如下: S51.接收范围查找请求,读入查找范围的起始值和终止值。 S52 .使用连续的虚拟地址在最高级表中查找该范围的起始值和终止值所在的桶的位 置。553. 利用虚拟地址空间连续性的特性,将S52中找到的所有桶一次性拷贝到内存中。554. 在内存中查找桶中大于等于范围查找的起始值并小于等于终止值的数据。555. 使用顺序查找依次在其他低级表中查找范围起始值所在的桶的位置。556. 从起始值所对应的桶的位置开始,按照顺序依次将找到的桶中满足条件的数据拷 贝至内存,直到遇到大于终止值的数据时结束查找。
【文档编号】G06F17/30GK105975587SQ201610293706
【公开日】2016年9月28日
【申请日】2016年5月5日
【发明人】诸葛晴凤, 沙行勉, 姜炜文
【申请人】诸葛晴凤
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1