本发明属于大数据存储技术领域,具体涉及一种辅助索引结合散列表的多维范围查询方法。
背景技术:
随着计算机技术的发展以及互联网的普及,数据量呈现了指数级的增长,因此数据存储规模不断扩大,对其进行的操作访问也越来越频繁,从而会导致系统操作性能下降。在大数据时代快速发展的背景下,索引已被广泛研究。目前,已有许多单属性查询谓词构建单维索引的技术被提出,但尚未提出更重要的多属性谓词查询的类似技术,这对于任何数据分析任务都是至关重要的。
多维范围查询(mdrq)是在多维搜索空间的两个或多个维度中选择区间结果的查询。为了发展mdrq,已经提出了许多多维索引(mdi)结构,它们在单个数据结构中索引多个属性,而无需扫描整个搜索的维度空间。但是从计算时间和存储空间的角度考虑,这些结构的创建和维护成本较高,从而使得数据库系统的整体性能下降。因此,在创建可行的多维索引结构的时候,需要仔细考虑后续查询效率和创建/维护成本之间的权衡。
在多键值数据库的数据存储结构中,将大量数据组合成多张表,每张表由多个行组成,每行包含唯一键和多个列,通常表根据唯一键进行排序。根据此数据模型实现多属性列的谓词查询,从理论上分析是可行的。基于多键值存储系统,可以在各个属性列上创建辅助索引,多个属性列可以创建多个辅助索引结构。因此,查询多个属性列可以基于各自的辅助索引查询得到满足条件的一组记录,从而避免了扫描全表的昂贵操作,减少了数据访问时间,提高了查询操作的效率。由于辅助索引结构会降低内存空间的使用率,因此辅助索引结构的选择和多维索引模型的创建是需要解决的主要问题。
技术实现要素:
本发明的目的在于克服现有技术中的不足,提出了一种辅助索引结合散列表的多维范围查询方法,解决了大量数据多属性查找耗时长和准确度低的技术问题。
为解决上述技术问题,本发明提供了一种辅助索引结合散列表的多维范围查询方法,包括以下步骤:
s1,为多键值存储系统中多维数据集构建与各维属性对应的辅助索引;
s2,根据待查询的各维属性的查询条件,分别从对应的辅助索引中查询获得满足对应查询条件的属性值,将属性值对应的主键构成相应的主键集合;
s3,对所有主键集合中最小的集合进行散列映射获得散列表;
s4,将其他主键集合散列映射匹配到此散列表中获得最终的节点,此节点的主键值对应的数据记录即是多维范围查询的最终查询结果。
进一步的,辅助索引采用b+树索引结构。
进一步的,对所有主键集合中最小的集合进行散列映射获得散列表的具体过程包括:
(1)对所有主键集合进行快速排序,选择最小一个主键集合;
(2)对此集合中各主键值使用散列函数进行主键散列值映射,并使用拉链法构造链表处理散列冲突,形成对应的散列表。
进一步的,散列函数如式(1)所示:
hash(key)=key%m(1);
其中,key是主键集合中的主键值,m是最小主键集合的主键数。
进一步的,为散列表中每个链表节点添加一个标记位flag,flag有两种值:0和1;0表示此节点无效,1表示此节点有效。
进一步的,将其他主键集合散列映射匹配到此散列表中获得最终的节点的具体过程为:
(1)对排序第二的主键集合进行散列映射匹配到散列表中:
先将散列表所有节点的flag值重置为0;
然后对主键集合中各主键值进行散列映射:
直接跳过与此空链表散列值相等的主键映射;
对于有与散列表中非空链表散列值相等的散列值对应的主键值,将主键值与非空链表中的节点的主键值进行比较,若两者相等,则将该主键对应节点的flag值设置为1;
若存在主键散列值与非空链表散列值相等但非空链表中无与该主键的值相等的节点,则不将该节点插入,保持链表的长度不变;
当主键集合主中各键值散列映射完成后,将flag为0的节点全部删除,若链表中的所有节点flag值均为0,则删除该链表中的所有节点,并将该链表置为空;
(2)重复步骤(1)的过程,按照集合大小排序依次对其他主键集合进行散列映射匹配到散列表中,查找flag为1的所有节点,即为同时满足多维属性查询条件的主键值,主键值对应的数据记录即是多维范围查询的最终查询结果。
本发明与现有技术相比,具有以下技术效果:
1)本发明采用b+树索引结构来进行单一属性范围查询。b+树索引所有的叶子节点使用链表相连,便于范围查找和遍历。
2)本发明构造散列函数进行主键值散列映射建立散列表,散列表中的节点为主键的值。同时添加节点标志位判断该节点是否无效,若整个链表上的节点都无效,则将该链表置为空,在剩下的主键集合映射匹配结果过程中,可以直接跳过与此空链表散列值相等的主键映射步骤,这样可以快速地进行结果匹配,节省结果匹配时间。
3)本发明将辅助索引的单一属性范围查询与散列映射匹配技术融合,充分利用二者的优点,有效提高数据库系统中查询数据的效率,既保证了系统的高吞吐量,又实现了对查询结果的准确性,提高了系统的整体性能。
附图说明
图1是本发明方法的流程图;
图2是本发明实施例的流程图。
具体实施方式
下面结合附图对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
在多键值数据库的数据存储结构中,将大量数据组合成多张表,每张表由多个行组成,一行是一条完整的数据记录,每行(一条完整的数据记录)包含唯一键(即主键,也是索引值)和多个列(每列即是一个属性值),每张表根据唯一键进行排序。基于多键值存储系统,可以在各个属性列上创建辅助索引,多个属性列可以创建多个辅助索引结构。因此,查询多个属性列可以基于各自的辅助索引查询得到满足条件的一组记录,从而避免了扫描全表的昂贵操作,减少了数据访问时间,提高了查询操作的效率。
本发明的一种辅助索引结合散列表的多维范围查询方法,包括以下过程:
s1,为多键值存储系统中多维数据集构建与各维属性对应的辅助索引;
s2,根据待查询的各维属性的查询条件,分别从对应的辅助索引中查询获得满足对应查询条件的属性值,将属性值对应的主键构成相应的主键集合;
s3,对所有主键集合进行排序,选出最小的集合进行散列映射获得散列表;
s4,按照排序依次将其他主键集合散列映射匹配到此散列表中,获得最终相同的节点,此节点的主键值对应的数据记录即是多维范围查询的最终查询结果。
本发明将辅助索引的单一属性范围查询与散列映射匹配技术融合,充分利用二者的优点,有效提高数据库系统中查询数据的效率,既保证了系统的高吞吐量,又实现了对查询结果的准确性,提高了系统的整体性能。
实施例1
本发明的一种辅助索引结合散列表的多维范围查询方法,方法流程图如图1所示,包括以下过程:
步骤1:为多键值存储系统中多维数据集构建与各维属性对应的辅助索引。
在多键值存储系统中,根据谓词查询包含的如姓名、年龄、成绩等属性,选择b+树来建立关于被查询属性的辅助索引结构。一个属性对应一个辅助索引。
本发明中选择b+树作为被查询属性的索引结构。b+树索引是对b树的一种变形树,但是b+树的非叶子节点只包含导航信息,不包含实际的值,所有的叶子节点使用链表相连,叶子节点中包含属性以及与此属性对应的主键值。b+树索引结构便于范围查找和遍历,因此适用于需要范围查询的数据存储系统。
步骤2:根据待查询的各维属性的查询条件,分别从对应的辅助索引中查询获得满足对应查询条件的属性值,将属性值对应的主键构成相应的主键集合。
利用步骤1创建好的辅助索引结构,根据待查询的维度和各维属性的范围查询条件进行属性值查询,从而获得满足各属性查询条件的属性值,为了查询方便,采用属性值对应的主键来进行索引,将各维属性查询条件查询得到的属性值对应的主键值构成相应的主键集合。例如从姓名对应的辅助索引中,查询姓名满足查询条件(姓为李-王)的属性值,将满足此条件的属性值的主键值(如1,3,5,8,24,29)构成一个主键集合。
步骤3:对所有主键集合进行排序,从中选出最小的集合,进行散列映射获得散列表。
建立散列表的过程为:
(1)对步骤2中各自属性查询条件对应的主键集合进行快速排序。
利用快速排序方法将所有通过各属性查询条件查询得到的主键集合按照集合大小(即主键数多少)进行从小到大排序,将集合标上相应的序号1、2、3…。
(2)从中选择主键数最少的一个主键集合,对此集合中各主键值进行散列值映射形成散列表。
因为最终同时满足多维属性查询条件的主键数不超过最小主键集合中的主键数,因此选择最小集合来建立散列表。使用最小集合建立的散列表是拥有最少节点数的散列表,从而使得下一步映射匹配规模达到最小值,减少匹配查找结果的时间。
从排好序的集合中选择最小主键集合即序号为1的主键集合,对其使用除留余数法构造散列函数进行主键散列值映射,并使用拉链法构造链表处理散列冲突,形成对应的散列表。
这里使用除留余数法构造散列函数如式(1)所示:
hash(key)=key%m(1);
其中,key是主键集合中的主键值,m是最小主键集合的主键数。
将主键集合中各主键值使用上述散列函数映射到散列表中。在散列表中,由于可能存在多个主键值映射到同一散列值上的情况,因此本发明采用拉链法构造链表处理散列冲突。拉链法构造链表就是把具有相同散列值的主键值放在同一个链表中,有m个散列值就有m个链表,同时用指针数组t[0…m-1]来存放各链表的头指针,该指针数组t即建立的散列表。凡是散列值为i(i∈[0,m-1])的主键都以节点方式插入到以t[i]为指针的单链表中,散列表中各链表的初值为空指针。
步骤4:按照排序依次将其他主键集合散列映射匹配到此散列表中,获得最终相同的节点,此节点即为同时满足多维属性查询条件的主键值,此主键值对应的数据记录即是多维范围查询的最终查询结果。
具体处理过程如下:
(1)在使用链表解决散列冲突的基础上,给每个链表节点添加一个标记位(flag),flag有两种值:0和1;0表示此节点无效,1表示此节点有效。
最小主键集合散列映射后得到的散列表,此时散列表具有m个链表,将m个链表上的每个节点的标记位flag值置为1,表示此时节点为有效节点。
(2)对主键数排序第二的一个主键集合进行散列映射匹配到散列表中。
先将散列表所有节点的flag值重置为0,
然后对主键集合中各主键值进行散列映射:
散列映射过程中,直接跳过与此空链表散列值相等的主键映射;
对于拥有与散列表中非空链表散列值相等的散列值对应的主键值,将主键值与非空链表中的节点的主键值进行比较,若两者相等,则将该主键对应节点的flag值设置为1,表示该主键散列值与非空链表散列值相等且该主键的值与此节点的主键值相等,此时链表中的这一节点为有效节点;
若存在主键散列值与非空链表散列值相等但非空链表中无与该主键的值相等的节点,则不将该节点插入,保持链表的长度不变。这样可以减少结果匹配的时间,从而可以快速得到最终满足谓词查询条件的完整数据记录集合,提高了查询效率。
当主键集合主中各键值散列映射完成后,将flag为0的节点全部删除,若链表中的所有节点flag值均为0,则删除该链表中的所有节点,并将该链表置为空。
(3)重复步骤(2)的过程,按照集合大小排序依次对其他主键集合进行散列映射匹配到散列表中,查找flag为1的所有节点,即为同时满足多维属性查询条件的主键值,此主键值对应的数据记录是多维范围查询的最终查询结果。最终得到多维查询结果是一条完整的数据记录,一条完整的数据记录包含一个主键,多个属性值。
实施例2
实施例参见图2,以下结合图2说明多维范围查询的处理过程。
步骤1:在多键值存储系统中,基于给定的三个属性(姓名、年龄、成绩)创建三个b+树辅助索引,索引id分别为1、2、3。
步骤2:基于三个辅助索引结构,进行范围查询获取各属性查询条件的属性值范围。其中,姓名的范围查询条件为李-王,年龄的范围查询条件为18-19,成绩的范围查询条件为80-90。然后根据获得的属性值范围获得对应的主键集合。
步骤3:在步骤2的索引查询结果中,姓名辅助索引中有6个属性值满足查询条件,将此6个属性值对应的主键值构成与姓名查询条件对应的主键集合;年龄辅助索引中有5个属性值满足查询条件,将此5个属性值对应的主键值构成与年龄查询条件对应的主键集合;成绩辅助索引中有7个属性值满足查询条件,将此7个属性值对应的主键值构成与成绩查询条件对应的主键集合。
步骤4:对三个集合按照集合大小进行排序,并按照排序结果从小到大标上序号1、2、3,即年龄对应的主键集合最小,标记序号为1,姓名对应的主键集合第二,标记序号为2,成绩对应的主键集合第三,标记序号为3。
步骤5:选择序号为1的主键集合使用散列函数(此函数中m数值为5)以及拉链法来构建散列表,并在散列表中添加节点标志位(flag)以确定链表中的节点是否无效。在初始建立的散列表中各节点均是有效节点。建立的散列表如图2所示:
散列值为0的链表中有1个节点,此节点中的主键值为5,标志位为1;
散列值为1的链表为空表,用“λ”表示;
散列值为2的链表中有2个节点,第一个节点的主键值为7,标志位为1;第二个节点的主键值为27,标志位为1;
散列值为3的链表为空表,用“λ”表示;
散列值为4的链表中有2个节点,第一个节点的主键值为4,标志位为1;第二个节点的主键值为24,标志位为1。
步骤6:对序号2的主键集合进行散列映射匹配到散列表中:
先将散列表中的5个节点flag值重置为0。然后对序号2的主键集合中各主键值进行散列映射,其中主键值1的散列值为1,主键值3的散列值为3,主键值5的散列值为0,主键值8的散列值为3,主键值24的散列值为4,主键值29的散列值为4。
由于散列表中散列值为1和3的链表为空,直接跳过与这两个链表散列值相等的主键散列映射(即主键值分别为1,3,8的主键值)。
主键值5的散列值0与非空链表的散列值0相等且此链表存在与主键值5相等的节点,因此判断此节点为有效节点,将主键值为5的节点flag值置为1。
主键值24的散列值4与非空链表的散列值相等且非空链表存在与主键值24相等的节点,因此判断此节点为有效节点,将主键值为24的节点flag值置为1。
集合中值为29的主键散列值4与链表散列值4相等,但29对应的节点不存在于此链表中,则跳过值为29的主键对应节点的新插入,保持原链表的长度不变,可以快速执行结果匹配,节省结果匹配时间。
对所有主键值经过散列映射匹配后,散列表的链表节点标记位flag为0的所有节点(即7,27,4)均属于无效节点,将无效节点从链表中删除(将无效节点使用图2中的“×”表示),以便稍后快速匹配结果。如果整个链表上的节点都使用“×”表示,则将链表设置为空,如图2中的散列值为2的链表用“λ”表示。
步骤6:对序号3的主键集合进行散列映射匹配到散列表中:
先将散列表中剩余的2个节点(即5和24)flag值重置为0。然后对序号3的主键集合中各主键值进行散列映射,主键值2,5,7,10,14,18,20的散列值分别对应为2,0,2,0,4,3,0。
由于散列值为1、2和3的链表为空,直接跳过与这两个链表散列值相等的主键散列映射(即主键值2,7,18)。
5的散列值0与非空链表的散列值0相等且非空链表存在与主键值5相等的节点,判断此节点为有效节点,将主键值为5的节点flag值置为1。
集合中值为10、20的主键散列值0与链表散列值0相等,但10、20对应的节点不存在于此链表中,则跳过值为10、20的主键;14的主键散列值4与链表散列值4相等,但14对应的节点不存在于此链表中,则跳过值为14的主键。
对所有主键值经过散列映射匹配后,散列表的链表节点标记位flag为0的所有节点(即24)均属于无效节点,将无效节点(24)使用图2中的“×”表示将无效节点从链表中删除,以便稍后快速匹配结果。此链表上的节点都使用“×”表示,则将链表设置为空,如图2中的散列值为4的链表用“λ”表示。
最后,只有主键值为5的节点flag为1,即只有此一个节点为有效节点,表明此节点是同时满足三个属性查询条件的主键值,主键值对应的数据记录是多维范围查询的最终查询结果。
本发明的有益效果为:本发明有效地将基于b+树索引的单一属性范围查询与散列映射匹配技术融合,充分利用二者的优点,有效提高数据库系统中查询数据的效率,既保证了系统的高吞吐量,又实现了对查询结果的准确性,提高了系统的整体性能。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变型,这些改进和变型也应视为本发明的保护范围。