CN105975587A - 一种高性能的内存数据库索引组织与访问方法 - Google Patents
一种高性能的内存数据库索引组织与访问方法 Download PDFInfo
- Publication number
- CN105975587A CN105975587A CN201610293706.0A CN201610293706A CN105975587A CN 105975587 A CN105975587 A CN 105975587A CN 201610293706 A CN201610293706 A CN 201610293706A CN 105975587 A CN105975587 A CN 105975587A
- Authority
- CN
- China
- Prior art keywords
- bucket
- data
- index
- virtual address
- memory database
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0806—Multiuser, multiprocessor or multiprocessing cache systems
- G06F12/0815—Cache consistency protocols
- G06F12/0817—Cache consistency protocols using directory methods
- G06F12/0824—Distributed directories, e.g. linked lists of caches
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0866—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches for peripheral storage systems, e.g. disk cache
- G06F12/0871—Allocation or management of cache space
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2272—Management thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2282—Tablespace storage structures; Management thereof
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种高性能的内存数据库索引组织与访问方法,首先整体的索引表结构分级组织;然后在系统的虚拟地址空间中为每级桶链表分配一个连续的虚拟地址空间;将各个桶链表映射到对应的虚拟地址空间;最后采用链表的方式组织各级索引结构中的索引及数据,链表中的每一项为一个桶组织,每个桶组织中存放有该桶组织自身的属性信息,与指向下一个桶组织的指针以及索引项信息。本发明提出的数据库索引组织结构,插入或删除数据时不需要对数据进行排序;VAB桶中的元素是无序存储,可通过位图来标识数据,不需要树结构那样为了维持内部元素的有序而每次插入或删除一个数据的时候都要进行排序,从而减少大量写NVM的次数。
Description
技术领域
本发明涉及数据库领域,特别是一种高性能的内存数据库索引组织与访问方法。
背景技术
随着计算机硬件技术的发展,内存的价格不断降低,内存容量越来越大,将数据库中全部或者部分数据存入内存中是完全可行。但是,传统的DRAM内存在掉电后不能保持数据,因此不具备数据存储功能。
近年来,出现了一种新型的存储器,即非易失性存储器(NVM)。该存储器的主要特点有:存储于NVM的数据不会因为掉电或者系统崩溃而丢失,其储容量可接近磁盘,NVM具有接近DRAM的读写速度。此外,非易失性存储器还具有高密度、低功耗、抗辐射等诸多优点。这些优点使得NVM被公认为有可能在未来数年内替代一部分传统的DRAM内存。NVM将给传统计算机内存增加数据存储的功能。这种NVM+DRAM的混合型内存在未来将成为高速数据存储系统架构的核心。
由于磁盘和内存在存储介质、存储方式和访问性能上存在巨大的差异,适用于磁盘的传统数据库索引并不适用于真正存储于内存的新型内存数据库,简单复制磁盘数据库索引的组织和访问方法将导致巨大的、不必要的系统开销,阻碍内存数据库系统的性能提升。同时,NVM的每个存储单元的使用寿命是有限的,当NVM的存储单元的擦写次数超过一个范围时,将可能导致其无法正确的存储数据。为了延长NVM内存的使用寿命,内存数据库的索引要尽可能地减少对NVM的写操作次数。因此,我们在本发明中提出一套全新的、适用于非易失性存储器的内存数据库索引组织与访问方法。
目前,在现有技术中,常用树型结构作为数据库的索引结构,比如B+Tree、T-tree。下面以B+Tree为例具体介绍其作为数据库索引的方案。B+Tree的总体结构如图1,节点分为三种:根节点,非叶子节点和叶节点。节点内部可以存放多个元素,并且按照从小到大的顺序有序存储。除此之外,还包含多个指针,比如指向节点的父节点的指针、指向孩子节点(对于叶节点来说,指向的是数据存储的地方)的指针、还有叶子节点独有的指向其兄弟节点的指针,如表1、表2。叶子节点存放索引的关键字以及对应的指向数据的指针,根节点和叶节点只存储索引关键字。底层叶节点用指针首尾相连,有利于对叶节点的遍历操作。
对于m-n阶B+Tree来说,需要满足的特性有:
(1)根节点是一个叶子结点或者是一个有2至m个孩子的非叶子结点;(2)内部结点有m/2至m个孩子,拥有的关键字数比拥有的孩子数少一;(3)叶节点有n/2至n个孩子,孩子指向实际的数据;(4)叶节点具有相同的高度;(5)所有结点存储的关键字是有序排列的;如图1所示的B+Tree中,m=3,n=4,即3-4阶B+Tree。
表1是B+Tree内部节点和根节点内部信息示意表,其中k1、k2……kn表示索引的关键字,ch0、ch1……chn表示指向孩子的指针,num表示节点中元素个数:
表1B+Tree内部节点及根节点
num | k1 | k2 | k3 | ... | kn |
ch0 | ch1 | ch2 | ch3 | chn |
表2是B+Tree叶子节内部信息示意表,k1、k2……kn表示关键字,p1、p2……pn表示指向数据的指针,num表示节点中元素个数:
表2B+Tree叶子节点:
num | k1 | k2 | k3 | ... | kn |
next | p1 | p2 | p3 | pn |
B+Tree作为NVM内存数据库索引主要有以下几个缺点:
(1)基于B+Tree的数据库索引在插入、删除操作中会引起大量针对NVM的写操作。因为内部索引节点和叶子节点中的数据都是根据关键字有序存放。不论是插入还是删除操作,只要需要改变节点中的存储信息,就需要重新调整数据的存放位置。调整位置的过程就会产生大量写NVM的操作。
(2)插入删除操作不光会导致更新信息的节点产生写NVM的操作,还会影响到其他节点。因为在插入删除时会引起节点的分裂或者合并操作,从而导致为了维护树的特性要大范围进行调平衡操作,这些操作会对当前节点的兄弟节点和父节点中存储的信息进行更改。更改信息的过程会产生大量的写操作。
(3)在范围查找时,B+Tree要逐个对叶节点进行访问查找,会显著的降低B+Tree的性能。因为B+Tree将全部的数据存放在叶节点中,并且叶节点的虚拟地址是离散的,所以在范围查找时,要逐个将满足查找范围的叶节点拷贝至内存中,不能利用连续的虚拟地址将所有符合的叶节点一次全部拷贝到内存。
(4)在内存中,为了提高缓存命中率,节点相对较小,因此树的高度很高,会导致B+Tree频繁的调整树的结构。调整结构就会带来大量的写NVM的操作。
不论是传统的B+Tree还是T-tree等树结构,为了维护其节点内部的有序性和树的平衡性,都需要经常做出调整,从而会有大量的NVM写操作,减少其寿命。
因此,需要一种高性能的内存数据库索引组织与访问方法。
发明内容
本发明的目的是提出一种高性能的内存数据库索引组织与访问方法。
本发明的目的是通过以下技术方案来实现的:
本发明提供的高性能的内存数据库索引组织与访问方法,包括以下步骤:
S1.整体的索引表结构分级组织;
S2.在系统的虚拟地址空间中为每级桶链表分配一个连续的虚拟地址空间;
S3.将各个桶链表映射到对应的虚拟地址空间;
S4.采用链表的方式组织各级索引结构中的索引及数据,链表中的每一项为一个桶组织,每个桶组织中存放有该桶组织自身的属性信息,与指向下一个桶组织的指针以及索引项信息。
进一步,所述步骤S2中的桶链表为单级或多级。
进一步,所述步骤S2中所述每级桶链表映射到连续或离散的虚拟地址空间中。
进一步,所述步骤S4中用链表、数组或其他结构组织桶,所述组织桶中存放的属性信息包括存放在该桶中的元素的最小值、最大值、个数和每个元素的标识信息。
进一步,还包括数据库索引离线构建,所述数据库索引离线构建的具体步骤如下:
S11.第一次为数据库构建索引表时,数据库中已经存有数据。首先扫描将要存储到数据库中的数据。
S12.根据数据库中已有的数据,选出划分索引的分界值。
S13.计算S12中选出的分界值之间的间距的平均值。选用该平均值作为桶中最大值与最小值的差值。
S14:按照S13得到的差值,建立一级表和二级表,然后将数据逐条插入表中。
进一步,所述步骤S12中在选择划分索引的分界值时,可以用选取中间值等方法确定分界值。
进一步,还包括内存数据库索引的插入方法,具体步骤如下:
S21.接收插入请求,读入待插入的数据。
S22.使用连续的虚拟地址或者使用顺序查找确定用于存放待插入数据的桶。
S23.当S22中找到的桶未满时,直接把待插入数据存放到桶的第一个空位。否则执行S4。
S24.创建一个新的桶,从原桶内的数据选出中位数(记为mid),设置新桶的最小值为mid,最大值为原桶的最大值,然后修改原桶的最大值为mid。之后将原桶中大于mid的数据复制到新桶中,同时修改原桶和新桶的位图以达到一致的效果。最后将新建的桶插入到二级表中。
进一步,还包括内存数据库索引的删除,所述内存数据库索引的删除具体步骤如下:
S31.接收删除请求,读入待删除的数据。
S32.使用连续的虚拟地址空间或者使用顺序查找找到存放待删除数据的桶。
S33.在S32中所找到的桶中,把存放待删除数据的位置标记为空闲位置。
进一步,还包括内存数据库索引的查找,所述内存数据库索引的查找具体步骤如下:
S41.接收查找请求,读入待查找的数据。
S42.使用连续的虚拟地址或者使用顺序查找获得待查找的数据所在的桶。
S43.在S42中所找到的桶中,搜索待查找的数据,并返回搜索到的数据。
进一步,还包括内存数据库索引的范围查找,所述内存数据库索引的范围查找具体步骤如下:
S51.接收范围查找请求,读入查找范围的起始值和终止值。
S52.使用连续的虚拟地址在最高级表中查找该范围的起始值和终止值所在的桶的位置。
S53.利用虚拟地址空间连续性的特性,将S52中找到的所有桶一次性拷贝到内存中。
S54.在内存中查找桶中大于等于范围查找的起始值并小于等于终止值的数据。
S55.使用顺序查找依次在其他低级表中查找范围起始值所在的桶的位置。
S56.从起始值所对应的桶的位置开始,按照顺序依次将找到的桶中满足条件的数据拷贝至内存,直到遇到大于终止值的数据时结束查找。
由于采用了上述技术方案,本发明具有如下的优点:
本发明提出的数据库索引组织结构,能最大程度的减少NVM擦写次数,使用VAB管理数据时,插入或删除数据时不需要对数据进行排序。VAB桶中的元素是无序存储的,可以通过位图来标识数据,并不需要像B-Tree等树结构那样为了维持内部元素的有序而每次插入或删除一个数据的时候都要进行排序,从而减少大量写NVM的次数。
VAB的结构稳定,不需要经常进行调整;VAB的桶链表组织方式使得VAB结构稳定,不需要像树结构那样经常进行调平衡的操作,从而大量地减少写NVM的次数。
使用连续的虚拟地址空间和硬件MMU访问索引;使用连续的虚拟地址空间组织索引。在访问索引的时候,利用CPU自带的硬件MMU和索引的虚拟地址定位索引的物理位置,从而避免了软件搜索索引的物理位置的开销,使得访问索引的速度更快。对于单元素查找,可以在桶链表所形成的连续的虚拟地址上使用二分法快速查找。范围查找时只需先在桶链表形成的虚拟地址上进行二分法快速定位到起始地址以及终止地址,然后一次性连续地读取该段虚拟地址。这种方式充分利用了MMU,并不像传统的树结构那样多次重复读取一个指针,然后找到节点的位置,拷贝数据到内存。与树结构相比,VAB节省了大量指针访问和数据拷贝的时间。
本发明的其他优点、目标和特征在某种程度上将在随后的说明书中进行阐述,并且在某种程度上,基于对下文的考察研究对本领域技术人员而言将是显而易见的,或者可以从本发明的实践中得到教导。本发明的目标和其他优点可以通过下面的说明书来实现和获得。
附图说明
本发明的附图说明如下。
图1为B+Tree示意图。
图2为索引存储于NVM介质的体系结构。
图3为数据库应用软件上下文。
图4为本发明的一级表整体结构。
图5为本发明的二级表结构图。
图6为本发明的VAB查找操作流程。
图7为本发明的VAB插入操作流程。
图8为本发明的VAB删除操作流程。
图9为本发明的VAB范围查找流程。
具体实施方式
下面结合附图和实施例对本发明作进一步说明。
实施例1
本实施例提供的缩略语和关键术语定义如下所述:NVM:Non-Volatile Memory,非易失性存储器;MMU:Memory Management Unit,存储管理单元;VAB:Virtual Address Bucket,虚拟地址桶;
如图所示,本实施例提供的高性能的内存数据库索引组织与访问方法,包括以下步骤:
S1.整体的索引表结构分级组织;
S2.在系统的虚拟地址空间中为每级桶链表分配一个连续的虚拟地址空间;
S3.将各个桶链表映射到对应的虚拟地址空间;
S4.采用链表的方式组织各级索引结构中的索引及数据,链表中的每一项为一个桶组织,每个桶组织中存放有该桶组织自身的属性信息,与指向下一个桶组织的指针以及索引项信息。
所述步骤S2中的桶链表为单级或多级。
所述步骤S2中所述每级桶链表映射到连续或离散的虚拟地址空间中。
所述步骤S4中用链表、数组或其他结构组织桶,所述组织桶中存放的属性信息包括存放在该桶中的元素的最小值、最大值、个数和每个元素的标识信息。
还包括数据库索引离线构建,所述数据库索引离线构建的具体步骤如下:
S11.第一次为数据库构建索引表时,数据库中已经存有数据。首先扫描将要存储到数据库中的数据。
S12.根据数据库中已有的数据,选出划分索引的分界值。
S13.计算S12中选出的分界值之间的间距的平均值。选用该平均值作为桶中最大值与最小值的差值。
S14:按照S13得到的差值,建立一级表和二级表,然后将数据逐条插入表中。
所述步骤S12中在选择划分索引的分界值时,可以用选取中间值等方法确定分界值。
还包括内存数据库索引的插入方法,具体步骤如下:
S21.接收插入请求,读入待插入的数据。
S22.使用连续的虚拟地址或者使用顺序查找确定用于存放待插入数据的桶。
S23.当S22中找到的桶未满时,直接把待插入数据存放到桶的第一个空位。否则执行S4。
S24.创建一个新的桶,从原桶内的数据选出中位数(记为mid),设置新桶的最小值为mid,最大值为原桶的最大值,然后修改原桶的最大值为mid。之后将原桶中大于mid的数据复制到新桶中,同时修改原桶和新桶的位图以达到一致的效果。最后将新建的桶插入到二级表中。
还包括内存数据库索引的删除,所述内存数据库索引的删除具体步骤如下:
S31.接收删除请求,读入待删除的数据。
S32.使用连续的虚拟地址空间或者使用顺序查找找到存放待删除数据的桶。
S33.在S32中所找到的桶中,把存放待删除数据的位置标记为空闲位置。
还包括内存数据库索引的查找,所述内存数据库索引的查找具体步骤如下:
S41.接收查找请求,读入待查找的数据。
S42.使用连续的虚拟地址或者使用顺序查找获得待查找的数据所在的桶。
S43.在S42中所找到的桶中,搜索待查找的数据,并返回搜索到的数据。
还包括内存数据库索引的范围查找,所述内存数据库索引的范围查找具体步骤如下:
S51.接收范围查找请求,读入查找范围的起始值和终止值。
S52.使用连续的虚拟地址在最高级表中查找该范围的起始值和终止值所在的桶的位置。
S53.利用虚拟地址空间连续性的特性,将S52中找到的所有桶一次性拷贝到内存中。
S54.在内存中查找桶中大于等于范围查找的起始值并小于等于终止值的数据。
S55.使用顺序查找依次在其他低级表中查找范围起始值所在的桶的位置。
S56.从起始值所对应的桶的位置开始,按照顺序依次将找到的桶中满足条件的数据拷贝至内存,直到遇到大于终止值的数据时结束查找。
实施例2
本实施例提供的高性能的内存数据库索引组织与访问方法,解决传统的磁盘数据库索引无法适用于计算机的内存管理环境,会造成巨大的、不必要的系统开销。
本实施例提供的内存数据库索引组织形式和访问方法,完全契合于计算机内存的环境,降低系统访问数据库索引结构的开销,极大程度地提高内存数据库性能。使得插入、删除、查找、范围查找这些数据库基本操作在NVM内存上高效地进行。内存数据库索引的组织和访问方式充分考虑NVM的存储特性,并尽可能地减少对NVM的写操作次数,维护NVM内存的使用寿命。
如图2所示,在使用NVM存储介质作为存储设备的体系结构中,NVM与CPU通过内存总线直接连接。系统中,DRAM存储器与NVM存储器处于同一个层级。此外,高速缓冲器Cache位于CPU中。在这种场景中,数据库的索引index与记录record都存储在NVM介质上。程序代码以及系统运行所建立的页表等结构将存储于DRAM中。而CPU在执行指令时将会首先把数据从DRAM或NVM调入Cache,然后进行访问。
图2为索引存储于NVM介质的体系结构,在这种场景中,索引Index的软件上下文环境如图3所示,图3为数据库应用软件上下文;通常,数据库应用程序主要执行插入、删除、查找以及范围查找四种操作。用户进程发出某个操作后,数据库进程通过解析器Parser进行语句解析以及访问优化处理,然后访问存储在NVM上的Index。对于插入与删除操作,将会对存储在NVM上的Index进行修改。对于查找与范围查找操作,将会通过Index定位到存储在NVM上所对应的记录Record。
1)VAB索引整体组织方式介绍
VAB索引整体结构由一级表、二级表和虚拟地址空间组成。一级表和二级表结构类似,都是由指针所连接的桶组成,每个桶可以存放多个元素。一级表中的桶将被映射到连续虚拟地址空间,目的是提升查找和范围查找的速度。一级表只有一个,其长度可随索引长度增大而增大。二级表可以有一个或多个,其桶结构没有与虚拟地址进行映射,主要用于缓冲,从而延迟一级表与虚拟地址重新映射。一级表和二级表之间是相互独立的。当需要建立数据库索引的时候,就会对一级表,二级表进行初始化,同时分配出一级表所映射的虚拟地址空间。当二级表的长度达到阈值,就要与一级表进行合并,此时就需要重新给一级表分配虚拟地址空间。
图4为一级表的整体结构示意图。链表中的每一项称之为桶,每一个桶中存放最小值,最大值,位图,数据和指向下一个桶的指针。
(1)最小值:指的是桶中可以存放的key(键值)的最小值。
(2)最大值:指的是桶中可以存放的key的最大值。
(3)位图:位图的每一位用来指示桶中对应位置是否存有数据。
(4)桶中存放的数据是以key和record成对存在的,我们将这一对称为pair。其中key指的是索引的键值,record是一个指向实际数据的指针。VAB索引中桶的概念与树结构中节点的概念类似。
一级表应遵循的规则是:
(1)每一个桶中的最大值大于最小值。
(2)桶链表是有顺序的,后一个桶的最小值要大于等于前一个桶的最大值。
(3)桶中最多可存放的元素个数是固定的,并且其中的每一个key的值,都应该大于等于相应的桶中指定的最小值并小于最大值。
(4)桶中的pair数据是无序、随意存放的,即不需要按照key的大小进行排序,并且两个pair之间不一定是紧挨在一起的。
本实施例利用了虚拟地址的特性,将桶链表的地址连续化。具体方式是:申请一段连续的虚拟地址空间,将桶链表中每一个桶的地址映射到桶映射虚拟地址区域,下面对这段虚拟地址区域的用途加以说明:
(1)桶映射虚拟地址区域用于提升全局查找速度
由于一级表整体是由链表的方式将每个桶组织起来的,而且一级表的长度无限。对于链表,其查找方式就只能顺序逐一查找,这样将大大降低查找速度。但以链表的方式组织索引结构的好处是,由于一级表中的桶链表是有序的,在添加或删除一个第一桶的时候只需要改动相应的指针即可,并不需要像数组一样为了维护有序性而使得插入或删除第一桶的时候,第一桶后面的桶全部要向后移动或向前移动,这样将产生大量的NVM写操作。因此,本发明通过将桶链表映射到虚拟地址空间,使得一级表中所有的桶的地址是连续的,进而可以使用二分查找的方法提升桶的查找速度。
(2)桶映射虚拟地址区域用于提升范围查找速度
传统的树结构节点与节点之间是指针连接,而在范围查找的过程中会涉及到非常多的节点,那么当客户端向服务器端数据库请求范围查找操作的时候,服务器端数据库将重复多次执行访问指针,拷贝整个节点到客户端内存这样的操作。而VAB通过将一级表中所有桶的地址映射到一块连续的虚拟地址空间,从而使得在执行客户端向服务器端数据库请求范围查找的时候,可以将虚拟地址空间中的起始地址到终止地址这段范围内的数据一次性拷贝到客户端的内存中,省去了多次的指针访问和内存拷贝的时间,从而提升了范围查找的速度。
图4为一级表整体结构,除了一级表,VAB索引还有二级表,其结构如图5所示。二级表的主要用来作为缓冲,由于一级表的桶链表映射到了虚拟地址区域,一旦一级表中插入新桶,为了保持一致性,就需要重新给一级表分配虚拟地址空间。所以一级表的结构不易经常变动。基于此,本发明设计了二级表用于缓冲,将新产生的桶插入二级表中,从而保证一级表的稳定性。
二级表的结构与一级表类似,整体结构也是链表,链表中每一项称之为桶,桶中存放最小值,最大值,位图数据和指向下一个槽的指针。这里不再赘述。与一级表不同的是:其一,一级表的长度是不受限制的,而二级表的长度是有最大限制的,当二级表达到指定的长度就需要与一级表合并;其二,二级表没有利用虚拟地址的概念,因为二级表长度比较短,所以按照顺序进行查找即可。注意,二级表的最大长度限制是可以随着数据库的使用情况而动态调整的。当数据库插入操作过多时,二级表的最大长度限制会增大,这样可以减少为一级表重新分配虚拟地址空间的操作;当数据库查询操作多时,二级表的最大长度限制会减少,这样可以提升查询效率,即多数查询在一级表中命中。
图5为二级表结构图,2)VAB索引的建立方式,VAB索引的建立分为以下两种情况:
在线:当用户进程请求建立数据库索引或插入新元素时,数据库进程逐条读取索引及其数据然后插入VAB索引表中。这种方法我们称为在线。
离线:当用户进程请求建立数据库索引时,数据库进程首先扫描一遍数据库表中所有要建立索引的键值,从而VAB可以根据这些键值的特点有针对性地初始化VAB索引表。这种方法我们称为离线。
以下分别为在线和离线建立VAB索引表的方法:
对于离线来说,首先数据库进程扫描所有要建立索引的的键值,根据现有的键值,确定出一个合适的key_padding(键值间隔,及每个桶中最大值与最小值之差)大小。从而使得每个桶内的元素能够比较均匀地分布。在后续的插入操作中,也能够尽可能降低桶分裂的次数,有效的提升性能。具体实现方法如下:首先扫描将要存储到数据库中的数据,利用采样排序的思想选出分界值,将这些分界值之间的间距的平均值作为key_padding的大小。按照这个key_padding,建立一级表和二级表,然后将数据逐条插入。
对于在线来说,根据系统默认的key_padding大小,建立空的一级表和二级表。然后将数据逐条插入。
3)VAB索引的查找操作,图6为VAB查找操作流程,如图6所示:
①用户进程调用数据库进程,请求执行查找操作。
②数据库进程读取待查找的值,准备执行查找操作。
③数据库进程依次查找一级表和二级表,直到找到所请求的索引所在的第一桶。在查找一级表的过程中,可以在桶链表所映射的连续虚拟地址空间中使用二分法查找,判断待查找的数据是否大于等于该桶的最小值并小于该桶的最大值,从而快速找到一级表中对应的第一桶。而查找二级表的过程中,则可以顺序扫描桶链表,进而找到待查找数据所对应的第一桶。
④若存在对应的第一桶,数据库进程扫描第一桶内的数据,判断是否存在要查找的值。若存在,数据库进程会返回该值,表示已经查找到;否则,表明没有查找到,返回用户空间。
4)VAB索引的插入操作,图7为VAB插入操作流程,如图7所示:
①用户进程调用数据库进程,请求执行插入操作。
②数据库进程读取待插入的值,准备执行插入操作。
③数据库进程依次查找一级表和二级表,直到确定所请求的索引所在的第一桶。在查找一级表的过程中,可以在桶链表所映射的连续虚拟地址空间中使用二分法查找,从而快速找到一级表中对应的第一桶。
④若存在对应的桶,数据库进程要判断插入值是否已存在。若存在,表明索引已存在,返回用户进程。若不存在则首先判断第一桶中的数据个数是否已经满了。
⑤若桶中存储的元素没有满,则直接插入key和record,并将位图中对应的位置置为1。若满了,则执行分裂操作:创建一个新的桶,从原桶内的数据选出中位数(记为mid),设置新桶的最小值为mid,最大值为原桶的最大值,然后修改原桶的最大值为mid。之后将原桶中大于mid的数据复制到新桶中,同时修改原桶和新桶的位图以达到一致的效果。最后将新建的桶插入到二级表中。
⑥若没有对应的桶,数据库进程会创建一个新桶,设置桶的最小值和最大值。将待插入值插入到桶中,修改位图中对应的位。最后将新建的桶插入二级表中。
5)VAB索引的删除操作,图8为VAB删除操作流程,如图8所示:
①用户进程调用数据库进程,请求执行删除操作。
②数据库进程读取待删除的值,准备执行删除操作。
③数据库进程依次查找一级表和二级表,直到确定是否存在所请求的索引所在的第一桶。在查找一级表的过程中,可以在桶链表所映射的连续虚拟地址空间中使用二分法查找,从而快速找到一级表中对应的第一桶。
④若存在对应的桶,数据库进程扫描桶内的数据,看是否存在待删除的值。若存在,数据库进程会将该值对应的位图位置为0,表示此数据已经无效;否则,表明不存在删除的值,返回用户空间。
6)VAB索引的范围查找操作,图9为VAB范围查找流程,如图9所示:
若范围查找(key_l,key_r),表示查找key_l至key_r之间的所有索引值,则有:
①用户进程调用数据库进程,请求执行范围查找操作。
②数据库进程获取边界范围值key_l和key_r,准备执行范围查找操作。
③数据库进程在一级表中查找,若以及表中没有桶的范围在待查找的范围内,则执行第④步。否则得到key_l和key_r所对应的桶的位置pos_l和pos_r。使用内存拷贝函数memcpy,将pos_l和pos_r之间所有桶对应的桶拷贝至内存。
④数据库进程在二级表中顺序查找,得到key_l所对应的桶的位置pos_l。判断该桶的最小值是否大于key_r。若最小值小于key_r,则将pos_l对应的桶拷贝至内存。查找其中满足给定范围的元素。对pos_l下一个桶指向的桶进行判断并查找,依次类推。
⑤最后内存对数据库进程拷贝到其中的数据进行排序并将最终结果输出给用户。
本实施例对数据库索引结构的组织与访问方法进行了改进。整体的索引结构改成桶链表式,并结合虚拟地址空间,充分利用MMU。该索引结构的组织与访问方法可以大大减少NVM的擦写次数并有较高的操作性能。
本实施例提供的数据库索引组织结构,最大程度的减少NVM擦写次数;
(1)使用VAB管理数据时,插入或删除数据时不需要对数据进行排序。
VAB桶中的元素是无序存储的,可以通过位图来标识数据,并不需要像B-Tree等树结构那样为了维持内部元素的有序而每次插入或删除一个数据的时候都要进行排序,从而减少大量写NVM的次数。
(2)VAB的结构稳定,不需要经常进行调整。
VAB的桶链表组织方式使得VAB结构稳定,不需要像树结构那样经常进行调平衡的操作,从而大量地减少写NVM的次数。
2.使用连续的虚拟地址空间和硬件MMU访问索引
使用连续的虚拟地址空间组织索引。在访问索引的时候,利用CPU自带的硬件MMU和索引的虚拟地址定位索引的物理位置,从而避免了软件搜索索引的物理位置的开销,使得访问索引的速度更快。
对于单元素查找,可以在桶链表所形成的连续的虚拟地址上使用二分法快速查找。范围查找时只需先在桶链表形成的虚拟地址上进行二分法快速定位到起始地址以及终止地址,然后一次性连续地读取该段虚拟地址。这种方式充分利用了MMU,并不像传统的树结构那样多次重复读取一个指针,然后找到节点的位置,拷贝数据到内存。与树结构相比,VAB节省了大量指针访问和数据拷贝的时间。
本实施例的高性能的内存数据库索引组织与访问方法中的NVM擦写次数少:
因为VAB桶内部的元素是无序的,插入删除操作都不需要对桶内部的元素排序。索引中所有的桶以链表的形式连接,在合并、分裂等操作的过程中只需要修改几个指针,从而大量减少了对NVM的擦写次数。
本实施例的高性能的内存数据库索引组织与访问方法中的数据库操作时间短:
因为桶内部元素无序,插入和删除操作时省去了排序的过程,查找和范围查找两个操作既可以直接在链表上进行查找又可以采用映射到虚拟地址空间的方式进行查找。而本发明采用后者,充分利用了MMU的特性,从而缩短了时间。
最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。
Claims (10)
1.一种高性能的内存数据库索引组织与访问方法,其特征在于:包括以下步骤:
S1.整体的索引表结构分级组织;
S2.在系统的虚拟地址空间中为每级桶链表分配一个连续的虚拟地址空间;
S3.将各个桶链表映射到对应的虚拟地址空间;
S4.采用链表的方式组织各级索引结构中的索引及数据,链表中的每一项为一个桶组织,每个桶组织中存放有该桶组织自身的属性信息,与指向下一个桶组织的指针以及索引项信息。
2.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:所述步骤S2中的桶链表为单级或多级。
3.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:所述步骤S2中所述每级桶链表映射到连续或离散的虚拟地址空间中。
4.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:所述步骤S4中用链表、数组或其他结构组织桶,所述组织桶中存放的属性信息包括存放在该桶中的元素的最小值、最大值、个数和每个元素的标识信息。
5.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括数据库索引离线构建,所述数据库索引离线构建的具体步骤如下:
S11.第一次为数据库构建索引表时,数据库中已经存有数据。首先扫描将要存储到数据库中的数据。
S12.根据数据库中已有的数据,选出划分索引的分界值。
S13.计算S12中选出的分界值之间的间距的平均值。选用该平均值作为桶中最大值与最小值的差值。
S14:按照S13得到的差值,建立一级表和二级表,然后将数据逐条插入表中。
6.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:所述步骤S12中在选择划分索引的分界值时,可以用选取中间值等方法确定分界值。
7.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括内存数据库索引的插入方法,具体步骤如下:
S21.接收插入请求,读入待插入的数据。
S22.使用连续的虚拟地址或者使用顺序查找确定用于存放待插入数据的桶。
S23.当S22中找到的桶未满时,直接把待插入数据存放到桶的第一个空位。否则执行S4。
S24.创建一个新的桶,从原桶内的数据选出中位数(记为mid),设置新桶的最小值为mid,最大值为原桶的最大值,然后修改原桶的最大值为mid。之后将原桶中大于mid的数据复制到新桶中,同时修改原桶和新桶的位图以达到一致的效果。最后将新建的桶插入到二级表中。
8.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括内存数据库索引的删除,所述内存数据库索引的删除具体步骤如下:
S31.接收删除请求,读入待删除的数据。
S32.使用连续的虚拟地址空间或者使用顺序查找找到存放待删除数据的桶。
S33.在S32中所找到的桶中,把存放待删除数据的位置标记为空闲位置。
9.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括内存数据库索引的查找,所述内存数据库索引的查找具体步骤如下:
S41.接收查找请求,读入待查找的数据。
S42.使用连续的虚拟地址或者使用顺序查找获得待查找的数据所在的桶。
S43.在S42中所找到的桶中,搜索待查找的数据,并返回搜索到的数据。
10.如权利要求1所述的高性能的内存数据库索引组织与访问方法,其特征在于:还包括内存数据库索引的范围查找,所述内存数据库索引的范围查找具体步骤如下:
S51.接收范围查找请求,读入查找范围的起始值和终止值。
S52.使用连续的虚拟地址在最高级表中查找该范围的起始值和终止值所在的桶的位置。
S53.利用虚拟地址空间连续性的特性,将S52中找到的所有桶一次性拷贝到内存中。
S54.在内存中查找桶中大于等于范围查找的起始值并小于等于终止值的数据。
S55.使用顺序查找依次在其他低级表中查找范围起始值所在的桶的位置。
S56.从起始值所对应的桶的位置开始,按照顺序依次将找到的桶中满足条件的数据拷贝至内存,直到遇到大于终止值的数据时结束查找。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610293706.0A CN105975587B (zh) | 2016-05-05 | 2016-05-05 | 一种高性能的内存数据库索引组织与访问方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610293706.0A CN105975587B (zh) | 2016-05-05 | 2016-05-05 | 一种高性能的内存数据库索引组织与访问方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105975587A true CN105975587A (zh) | 2016-09-28 |
CN105975587B CN105975587B (zh) | 2019-05-10 |
Family
ID=56991133
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610293706.0A Active CN105975587B (zh) | 2016-05-05 | 2016-05-05 | 一种高性能的内存数据库索引组织与访问方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105975587B (zh) |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108108413A (zh) * | 2017-12-12 | 2018-06-01 | 宁波三星医疗电气股份有限公司 | 一种基于存储数据自动生成数据指针的方法及系统 |
CN108509585A (zh) * | 2018-03-29 | 2018-09-07 | 重庆大学 | 一种异构数据实时交互优化处理方法 |
CN109271390A (zh) * | 2018-09-30 | 2019-01-25 | 天津大学 | 一种基于神经网络的索引数据结构及其数据检索方法 |
CN109407978A (zh) * | 2018-09-27 | 2019-03-01 | 清华大学 | 高并发索引b+链表数据结构的设计与实现方法 |
CN109933584A (zh) * | 2019-01-31 | 2019-06-25 | 北京大学 | 一种多级无序索引方法与系统 |
CN110737547A (zh) * | 2019-10-22 | 2020-01-31 | 第四范式(北京)技术有限公司 | 使用非易失性存储器nvm恢复内存数据库的方法和设备 |
CN110888886A (zh) * | 2019-11-29 | 2020-03-17 | 华中科技大学 | 一种索引结构及构建方法、键值存储系统及请求处理方法 |
CN111062810A (zh) * | 2019-11-12 | 2020-04-24 | 上交所技术有限责任公司 | 适用于证券交易系统基于接口多维索引数据的处理方法 |
WO2020102998A1 (zh) * | 2018-11-20 | 2020-05-28 | 华为技术有限公司 | 一种删除内存中索引项的方法、装置 |
CN111931005A (zh) * | 2020-07-23 | 2020-11-13 | 上海卫星工程研究所 | 基于索引映射的多源遥测通用化处理方法及系统 |
CN112506922A (zh) * | 2020-11-19 | 2021-03-16 | 江苏大学 | 面向混合固态存储系统的嵌入式IoT时序数据库设计方法 |
CN112632087A (zh) * | 2020-05-27 | 2021-04-09 | 北京大学 | 基于范围简图的有序链表快速查询方法和装置 |
CN112784120A (zh) * | 2021-01-25 | 2021-05-11 | 浪潮云信息技术股份公司 | 一种基于范围分片方式的kv内存数据库存储管理方法 |
CN113051241A (zh) * | 2019-12-27 | 2021-06-29 | 中国移动通信集团湖南有限公司 | 数据库持久化的方法、装置及设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101782922A (zh) * | 2009-12-29 | 2010-07-21 | 山东山大鸥玛软件有限公司 | 一种面向海量数据检索的多级桶哈希索引方法 |
CN102541968A (zh) * | 2010-12-31 | 2012-07-04 | 百度在线网络技术(北京)有限公司 | 一种索引方法 |
CN105404667A (zh) * | 2015-11-13 | 2016-03-16 | 重庆大学 | 一种用于内存文件系统的文件数据一致性更新方法 |
-
2016
- 2016-05-05 CN CN201610293706.0A patent/CN105975587B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101782922A (zh) * | 2009-12-29 | 2010-07-21 | 山东山大鸥玛软件有限公司 | 一种面向海量数据检索的多级桶哈希索引方法 |
CN102541968A (zh) * | 2010-12-31 | 2012-07-04 | 百度在线网络技术(北京)有限公司 | 一种索引方法 |
CN105404667A (zh) * | 2015-11-13 | 2016-03-16 | 重庆大学 | 一种用于内存文件系统的文件数据一致性更新方法 |
Non-Patent Citations (1)
Title |
---|
袁培森: "用于内存数据库的Hash 索引的设计与实现", 《计算机工程》 * |
Cited By (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108108413A (zh) * | 2017-12-12 | 2018-06-01 | 宁波三星医疗电气股份有限公司 | 一种基于存储数据自动生成数据指针的方法及系统 |
CN108509585A (zh) * | 2018-03-29 | 2018-09-07 | 重庆大学 | 一种异构数据实时交互优化处理方法 |
CN109407978A (zh) * | 2018-09-27 | 2019-03-01 | 清华大学 | 高并发索引b+链表数据结构的设计与实现方法 |
CN109407978B (zh) * | 2018-09-27 | 2020-07-28 | 清华大学 | 高并发索引b+链表数据结构的设计与实现方法 |
CN109271390A (zh) * | 2018-09-30 | 2019-01-25 | 天津大学 | 一种基于神经网络的索引数据结构及其数据检索方法 |
WO2020102998A1 (zh) * | 2018-11-20 | 2020-05-28 | 华为技术有限公司 | 一种删除内存中索引项的方法、装置 |
CN109933584B (zh) * | 2019-01-31 | 2021-04-02 | 北京大学 | 一种多级无序索引方法与系统 |
CN109933584A (zh) * | 2019-01-31 | 2019-06-25 | 北京大学 | 一种多级无序索引方法与系统 |
CN110737547A (zh) * | 2019-10-22 | 2020-01-31 | 第四范式(北京)技术有限公司 | 使用非易失性存储器nvm恢复内存数据库的方法和设备 |
CN111062810A (zh) * | 2019-11-12 | 2020-04-24 | 上交所技术有限责任公司 | 适用于证券交易系统基于接口多维索引数据的处理方法 |
CN110888886A (zh) * | 2019-11-29 | 2020-03-17 | 华中科技大学 | 一种索引结构及构建方法、键值存储系统及请求处理方法 |
CN110888886B (zh) * | 2019-11-29 | 2022-11-11 | 华中科技大学 | 一种索引结构及构建方法、键值存储系统及请求处理方法 |
CN113051241A (zh) * | 2019-12-27 | 2021-06-29 | 中国移动通信集团湖南有限公司 | 数据库持久化的方法、装置及设备 |
CN113051241B (zh) * | 2019-12-27 | 2023-08-15 | 中国移动通信集团湖南有限公司 | 数据库持久化的方法、装置及设备 |
CN112632087A (zh) * | 2020-05-27 | 2021-04-09 | 北京大学 | 基于范围简图的有序链表快速查询方法和装置 |
CN112632087B (zh) * | 2020-05-27 | 2022-10-14 | 北京大学 | 基于范围简图的有序链表快速查询方法和装置 |
CN111931005A (zh) * | 2020-07-23 | 2020-11-13 | 上海卫星工程研究所 | 基于索引映射的多源遥测通用化处理方法及系统 |
CN111931005B (zh) * | 2020-07-23 | 2024-05-24 | 上海卫星工程研究所 | 基于索引映射的多源遥测通用化处理方法及系统 |
CN112506922A (zh) * | 2020-11-19 | 2021-03-16 | 江苏大学 | 面向混合固态存储系统的嵌入式IoT时序数据库设计方法 |
CN112506922B (zh) * | 2020-11-19 | 2024-09-27 | 江苏大学 | 面向混合固态存储系统的嵌入式IoT时序数据库设计方法 |
CN112784120A (zh) * | 2021-01-25 | 2021-05-11 | 浪潮云信息技术股份公司 | 一种基于范围分片方式的kv内存数据库存储管理方法 |
Also Published As
Publication number | Publication date |
---|---|
CN105975587B (zh) | 2019-05-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105975587A (zh) | 一种高性能的内存数据库索引组织与访问方法 | |
CN110083601B (zh) | 面向键值存储系统的索引树构建方法及系统 | |
CN110888886B (zh) | 一种索引结构及构建方法、键值存储系统及请求处理方法 | |
US6546394B1 (en) | Database system having logical row identifiers | |
EP2199935A2 (en) | Method and system for dynamically partitioning very large database indices on write-once tables | |
CN105320775A (zh) | 数据的存取方法和装置 | |
MXPA01000123A (es) | Base de datos implementada por computadora con conectividad valor caso. | |
CN108897761A (zh) | 一种聚簇存储方法及装置 | |
CN106326475A (zh) | 一种高效的静态哈希表实现方法及系统 | |
US6745198B1 (en) | Parallel spatial join index | |
CN102629269A (zh) | 一种嵌入式数据库的检索及存储方法 | |
CN104021223A (zh) | 一种集群数据库测点的访问方法及装置 | |
CN113392089B (zh) | 一种数据库索引优化方法及可读存储介质 | |
Alam et al. | Performance of point and range queries for in-memory databases using radix trees on GPUs | |
CN113722274A (zh) | 一种高效的R-tree索引遥感数据存储模型 | |
US20200019539A1 (en) | Efficient and light-weight indexing for massive blob/objects | |
CN113821508B (zh) | 一种数组索引的实现方法和系统 | |
WO2015129109A1 (ja) | インデックス管理装置 | |
CN112860734B (zh) | 地震数据多维度范围查询方法及装置 | |
CN102968467A (zh) | 一种多层Bloom Filter的优化方法及查询方法 | |
GB2614676A (en) | Managing least-recently-used data cache with persistent body | |
CN109241098B (zh) | 一种分布式数据库的查询优化方法 | |
KR20220099745A (ko) | 지리공간 블록체인 데이터 검색을 위한 공간 분할 기반의 트리 인덱싱 및 질의어 처리 방법 및 장치 | |
CN112148792A (zh) | 一种基于HBase的分区数据调整方法、系统及终端 | |
CN114090570B (zh) | 一种基于基数树与哈希表结合的数据存储方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |