一种基于多个相关字段组合索引存储结构及建立、查询与维护方法

文档序号:6511354阅读:229来源:国知局
一种基于多个相关字段组合索引存储结构及建立、查询与维护方法【专利摘要】本发明提供一种基于多个相关字段组合索引存储结构,包括用以存储各个字段相应的hash值对应的hash冲突链在数据区的字节偏移量的散列表,用以存储包括行号(rowid)和实际的组合索引的各个字段值的值(data)的数据区及用以表示所在行是否删除的信息的删除位图(delete-bitmap)。此外还提供了针对本存储结构的相应建立、查询和维护的方法。当对多个关联字段的任意一个字段进行等值查询,或者对多个关联字段中的多个字段或者全部字段进行or或者and条件的等值查询时都能利用本发明之索引,而且对条件的顺序没有限制。【专利说明】—种基于多个相关字段组合索引存储结构及建立、查询与维护方法【
技术领域
】[0001]本发明属于数据处理领域,尤其是涉及一种基于多个相关字段组合索引存储结构及建立、查询与维护方法。【
背景技术
】[0002]以MemcacheDB、TokyoTyrant、MongoDB为代表的key-value数据存储都是基于一个字段作为key,该key以btree或者哈希方式创建索引,以该key做为查询条件时,查询效率很高,以其他非key字段做为查询条件时,必须全表扫描,查询效率低下。如涉及到多个关联字段的or条件类的查询,其中的key字段能使用索引,其他字段必须全列扫描。传统的多个字段作为组合索引的系统,该索引类型只能支持“and”型的查询,并且索引对顺序有要求,例如组合索引为key(fl,f2,f3),则对该索引的使用有顺序要求,只有以下查询能使用上该索引:[0003](I)fl=xxx[0004](2)fl=xxxandf2=xxx[0005](3)fI=xxxandf2=xxxandf3=xxx【
发明内容】[0006]本发明提供一种基于多个相关字段组合索引存储结构及建立、查询与维护方法,尤其适合对多个关联字段的任意一个字段进行等值查询及对多个关联字段中的多个字段或者全部字段进行or或者and条件的等值查询。并且对条件的顺序没有限制。[0007]为解决上述技术问题,本发明采用的技术方案是:一种建立基于多个相关字段组合索引存储的方法,包括:[0008]I)指定组合索引的各个字段及创建各个字段相应的hash值;[0009]2)建立用以存储各个字段相应的hash值对应的hash冲突链在数据区的字节偏移量的散列表;[0010]3)建立用以存储包括行号(rowid)和实际的组合索引的各个字段值的值(data)的数据区;[0011]4)建立用以表示所在行是否删除的信息的删除位图(delete-bitmap)。根据本发明的另一方面,还提供了一种于多个相关字段组合索引存储结构,包括:[0012]用以存储各个字段相应的hash值对应的hash冲突链在数据区的字节偏移量的散列表;[0013]用以存储包括行号(rowid)和实际的组合索引的各个字段值的值(data)的数据区;[0014]用以表示所在行是否删除的信息的删除位图(delete-bitmap)。[0015]根据本发明的另一方面,本发明还提供了一种对单一字段条件的查询方法,包括:[0016]I)计算字段值的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0017]2)变历所有的数据页,从数据页中的data数据项中把该单一字段的值取出,和该字段的值进行匹配,获得所有匹配的rowid;[0018]3)根据上一步获得的所有rowid,查看delete-bitmap,去除掉已经删除的行的rowid,根据rowid来获得查询结果。[0019]进一步的,本发明还提供了对两个相同值的字段且查询条件为or运算查询方法,包括:[0020]I)计算相同查询条件的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0021]2)变历所有的数据页,从数据页中的data数据项中分别把各字段的值取出,分别和查询条件值进行匹配,只要其中任意一个值匹配上既可,获得所有匹配的rowid;[0022]3)将第二步得到的rowid进行distinct去重,查看delete-bitmap,去除掉已经删除的行,根据rowid来获得查询结果。[0023]进一步的,基于多个相关字段组合索引存储结构对两个不同值的字段且查询条件为or运算的查询方法,包括:[0024]I)任意指定组合中一字段值为第一字段,计算组合中第一字段值hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0025]2)变历所有的数据页,从数据页中的data数据项中把组合中第一字段的值取出,与第一字段值进行匹配,获得所有匹配的rowid;[0026]3)计算第二字段值的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0027]4)变历所有的数据页,从数据页中的data数据项中把第二字段的值取出,与第二字段值进行匹配,获得所有匹配的rowid;[0028]将第二步和第四步得到的rowid进行distinct去重,查看delete-bitmap,除掉已经删除的行,根据rowid的来获得查询结果。[0029]进一步的,基于多个相关字段组合索引存储结构对两个不同值的字段且查询条件为and运算的查询方法,包括:[0030]I)任意指定组合中一字段值为第一字段,计算第一字段字段值的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0031]2)变历所有的数据页,从数据页中的data数据项中把第一字段的值取出,和第一字段值进行匹配,从数据页中data数据项中将第二字段的字段的值取出,和第二字段值进行匹配,两个值都能匹配上,则获得该rowid满足条件;[0032]3)将得到的rowid的结果查看delete-bitmap,去除掉已经删除的行,根据rowid来获得查询结果。[0033]进一步的,基于多个相关字段组合索引存储结构对两个字段的and条件,其中一个字段的内部为or条件的查询条件的值都不相同的运算的查询方法,包括:[0034]I)指定组合中内部无or条件运算的字段为第一字段,计算第一字段字段值hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0035]2)变历所有的数据页,从数据页中的data数据项中把第一字段的值取出,和第一字段值进行匹配,将第二字段的值取出,和第二字段or条件的第一值或者第二字段or条件的第二值进行匹配,两个字段的值都能匹配上,则获得该rowid满足条件;[0036]3)将得到的rowid的结果查看delete-bitmap,去除掉已经删除的行,将最终的rowid的count值获得查询结果。[0037]根据本发明的另一方面,还提供了一种根据权利要求2所述基于多个相关字段组合索引存储结构的增加数据方法,包括:[0038]I)计算组合字段该字段hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0039]2)变历所有的数据页,获取空闲页,在空闲数据页写入一行数据,内容为rowid和data,data的内容为第一字段的size及value,各个其余剩余字段的size及value;[0040]3)判断该字段是否为组合字段的最后一个字段,如果是则增加过程结束,如果为否,则转入第一步骤。[0041]进一步的,本发明还提供了一种基于多个相关字段组合索引存储结构的查询方法方法,包括:[0042]I)根据多个相关字段的查询条件来确定整体的查询条件是or查询还是and查询;[0043]2)当整体的查询条件是or查询时,依次对每一个查询条件进行处理,处理后得到每一个查询条件的结果rowid,对这些结果rowid进行distinct去重后的rowid作为最终rowid,根据最终rowid来获得查询结果;[0044]3)当整体的查询条件是and查询时,依次对每一个查询条件进行处理处理后得到每一个查询条件的结果rowid,对得到的所有这些查询条件的结果rowid取交集,然后再对这些结果rowid进行distinct去重后的rowid作为最终rowid,根据最终rowid来获得查询结果。[0045]由于采用上述技术方案,当对多个关联字段的任意一个字段进行等值查询,或者对多个关联字段中的多个字段或者全部字段进行or或者and条件的等值查询时都能利用该索引,而且对条件的顺序没有限制。同时,将多个字段作为组合索引后,没有额外的维护一致性开销,做“or”查询时性能优势明显。本发明最大的性能优势体现在“or”优化上,最大的灵活性优势体现在不限制组合索引字段的次序上。【专利附图】【附图说明】[0046]图1是本发明的散列表及数据区的存储结构示意图[0047]图2是本发明的一个实例中delete-bitmap存储结构示意图[0048]图3是本发明的一个实例中散列表及数据区的存储结构示意图[0049]图4是本发明的一个实例中增加数据的流程示意图[0050]图5是本发明的一个实例中删除数据的流程示意图【具体实施方式】[0051]在现有的key-value数据库的基础上,我们将实现一种基于多个关联字段作为组合key,以hash索引方式的key-value新型数据库,该key-value新型数据库的底层存储用key-value,上层提供一个SQL接口层来支持SQL,功能包括多个关联字段的组合索引的schema创建,组合索引的存储及增删改查对组合索引的维护及使用。[0052]多个关联字段的组合索引的架构(schema)的创建[0053]需要指定组合索引的各个字段及索引类型,本实例的索引类型为hash方式,此外也可采用btree实现方式来完成,采用hash变换能够快速准确的取得所查记录来支持如下方式创建组合索引,其内容如下:[0054]Createtabletablename(fIvarchar(100),f2varchar(100),f3varchar(100),f4varchar(100),key(fI,f2,f3)usinghash);[0055]为组合索引建立存储[0056]图1为基于多个关联字段的组合索引的存储结构示意图,图中散列表的内容存储相应哈希值对应的hash冲突链在数据区中的字节偏移量。图中数据区部分为实际的数据存储结构,按照页进行管理,每个hash冲突链由一到多个页组成,页的大小为4k的整数倍,所有的hash冲突链的页连续存储,每个页的尾部存储了指向下一页的指针。每一个数据页有多行数据组成,每行数据由rowid和data组成,rowid为行号,data为组合索引的各个字段的实际的值,字段的值按照变长存储,先存储长度,紧接着存储字段的实际值,data部分的结构示意如图3所示。[0057]另外,还需额外创建一个用于对表维护的位图(bitmap),如图2所不,我们称为删除位图(delete-bitmap),每个位(bit)对应一行数据,初始值为1,当需要对数据行进行删除操作时,找到该行所对应的bitmap的位置的值,把该值取O后保存即可。[0058]下面对针对本实例如何对组合索引进行相应的运算查询做详细描述:[0059](I)单一字段条件的查询[0060]例如SQL如下:selectcount(*)fromTabIeNamewheref2=vI;[0061]执行流程如下:[0062]第一步:计算f2字段值vl的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0063]第二步:变历所有的数据页,从数据页中的data数据项中把f2字段的值取出,和vl进行匹配,获得所有匹配的rowid;[0064]第三步:根据上一步获得的所有rowid,查看delete-bitmap,去除掉已经删除的行的rowid,将最终的rowid的count值返回。[0065]由本查询实例可以看出,传统的多个字段作为组合索引的系统,因对组合索引的字段使用有顺序要求,因此无法利用到该组合索引,但使用本发明提供的多个关联字段的组合索引,因对组合索引的字段使用没有顺序要求,因此在对组合索引的任意一个字段进行查询时,都能够使用到该组合索引。[0066](2)两个字段的or条件的查询,查询条件的值相同[0067]例如SQL如下:selectcount(*)fromTabIeNamewheref2='xxx,orf3='xxx,;[0068]执行流程如下:[0069]第一步:因为f2,f3值相同,因此计算值为’xxx’的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0070]第二步:变历所有的数据页,从数据页中的data数据项中把f2字段的值取出,f3字段的值取出,分别和XXX进行匹配,只要其中任意一个值匹配上既可,获得所有匹配的rowid;[0071]第三步:将第二步得到的rowid进行distinct(去掉重复)操作,查看delete-bitmap,去除掉已经删除的行,将最终的rowid的count值返回。[0072]在本实例中f2,f3查询条件的值相同,在此基础上还能够再做优化,此时只需要访问一个hash桶的冲突链中的数据页,运行效率比传统的基于一个字段建立key-value的数据存储快很多。[0073](3)两个字段or条件的查询,查询条件的值不相同[0074]例如SQL如下:selectcount(*)fromTableNamewheref2=vlorf3=v2;[0075]执行流程如下:[0076]第一步:计算f2字段值为vl的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0077]第二步:变历所有的数据页,从数据页中的data数据项中把f2字段的值取出,和vl进行匹配,获得所有匹配的rowid;[0078]第三步:计算f3字段值为v2的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0079]第四步:变历所有的数据页,从数据页中的data数据项中把f3字段的值取出,和v2进行匹配,获得所有匹配的rowid;[0080]第五步:将第二步和第四步得到的rowid进行distinct去重,查看delete-bitmap,去除掉已经删除的行,将最终的rowid的count值返回。[0081]从本实例可以看出,传统的多个字段作为组合索引的系统,因对组合索引的字段使用有顺序要求,因此无法利用到该组合索引,但使用本发明提供的多个关联字段的组合索引,因对组合索引的字段使用没有顺序要求,因此在对组合索引的任意一个字段进行查询时,都能够使用到该组合索引。因为f2,f3查询条件的值不同,因此需要访问两个hash桶的冲突链中的数据页,比实例2要多访问一个hash桶。[0082](4)两个字段and条件的查询,查询条件的值不相同[0083]例如SQL如下:selectcount(*)fromTableNamewheref2=vlandf3=v2;[0084]执行流程如下:[0085]第一步:计算f2字段值为vl的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0086]第二步:变历所有的数据页,从数据页中的data数据项中把f2字段的值取出,和vl进行匹配,f3字段的值取出,和v2进行匹配,两个值都能匹配上,则获得该rowid满足条件;[0087]第三步:将得到的rowid的结果查看delete-bitmap,去除掉已经删除的行,将最终的rowid的count值返回。[0088]使用本发明提供的多个关联字段的组合索引,因对组合索引的字段使用没有顺序要求,因此在对组合索引的任意一个字段进行查询时,都能够使用到该组合索引。因为f2,f3的and查询,因此只需要访问其中任意一个字段(例如f2)的hash桶的冲突链中的数据页即可。[0089](5)两个字段and和or组合条件的查询[0090]例如SQL如下:selectcount(*)fromTableNamewheref2=vland(f3=v2orf3=v3);[0091]执行流程如下:[0092]第一步:计算f2字段值为vl的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0093]第二步:变历所有的数据页,从数据页中的data数据项中把f2字段的值取出,和vl进行匹配,f3字段的值取出,和v2或者v3进行匹配,都能匹配上,则获得该rowid满足条件;[0094]第三步:将得到的rowid的结果查看delete-bitmap,去除掉已经删除的行,将最终的rowid的count值返回。[0095]在本实例中,在fl的值确定的情况下对f2,f3的and查询,只需要访问其中任意一个字段(例如f2)的hash桶的冲突链中的数据页即可。[0096]在日常使用中,经常会有数据的变化,必然会引起相对应的维护过程。一般来说维护主要包括增加、删除及修改。[0097]以组合索引为key(fl,f2,f3)为例,增加数据创建组合索引流程是:先对所有索引列的值分别做hash,命中几个hash桶就把这条数据追加到那些桶中,相同hash值不用重复存储。此外,hash索引中会存在冗余(一条数据出现在多个哈希桶中),其具体流程如下:[0098]第一步:fl的值计算hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0099]第二步:变历所有的数据页,获取空闲页,在空闲数据页写入一行数据,内容为rowid和data,data的内容为fl字段的size及value,f2字段的size及value,f3字段的size及value;[0100]第三步:f2的值计算hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0101]第四步:变历所有的数据页,获取空闲页,在空闲数据页写入一行数据,内容为rowid和data,data的内容为fl字段的size及value,f2字段的size及value,f3字段的size及value;[0102]第五步:f3的值计算hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;[0103]第六步:变历所有的数据页,获取空闲页,在空闲数据页写入一行数据,内容为rowid和data,data的内容为fl字段的size及value,f2字段的size及value,f3字段的size及value;[0104]基于效率的考虑,删除操作一般并不会真正的删除索引数据,而是将delete-bitmap对应行的位置设置为0,流程如下:[0105]第一步:根据查询条件获得需要删除行的rowid(根据查询条件获得满足条件行的rowid的流程详见查询流程说明);[0106]第二步:根据该rowid,计算出该行在delete-bitmap中的对应位置,设置delete-bitmap对应位置的值为O。如图2所示。[0107]对于数据修改来说,修改操作流程就是先删除,再增加的过程。其具体过程可参考上述删除、增加的操作方式,在此不进行详细描述。[0108]以上对本发明的一个实施例进行了详细说明,但所述内容仅为本发明的较佳实施例,不能被认为用于限定本发明的实施范围。凡依本发明申请范围所作的均等变化与改进等,均应仍归属于本发明的专利涵盖范围之内。【权利要求】1.一种建立基于多个相关字段组合索引存储的方法,包括:1)指定组合索引的各个字段及创建各个字段相应的hash值;2)建立用以存储各个字段相应的hash值对应的hash冲突链在数据区的字节偏移量的散列表;3)建立用以存储包括行号(rowid)和实际的组合索引的各个字段值的值(data)的数据区;4)建立用以表示所在行是否删除的信息的删除位图(delete-bitmap)。2.一种根据权利要求1所述的方法生成的基于多个相关字段组合索引存储结构,包括:用以存储各个字段相应的hash值对应的hash冲突链在数据区的字节偏移量的散列表;用以存储包括行号(rowid)和实际的组合索引的各个字段值的值(data)的数据区;用以表示所在行是否删除的信息的删除位图(delete-bitmap)。3.一种根据权利要求2所述基于多个相关字段组合索引存储结构对单一字段条件的查询方法,包括:O计算字段值的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;2)变历所有的数据页,从数据页中的data数据项中把该单一字段的值取出,和该字段的值进行匹配,获得所有匹配的rowid;3)根据上一步获得的所有rowid,查看delete-bitmap,去除掉已经删除的行的rowid,根据rowid来获得查询结果。4.一种根据权利要求2所述基于多个相关字段组合索引存储结构对两个字段的值相同且查询条件为or运算的查询方法,包括:1)计算相同查询条件的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;2)变历所有的数据页,从数据页中的data数据项中分别把各字段的值取出,分别和查询条件值进行匹配,只要其中任意一个值匹配上既可,获得所有匹配的rowid;3)将第二步得到的rowid进行distinct去重,查看delete-bitmap,去除掉已经删除的行,根据rowid来获得查询结果。5.一种根据权利要求2所述基于多个相关字段组合索引存储结构对两个字段的值不相同,查询条件为偶然运算的查询方法,包括:1)任意指定组合中一字段值为第一字段,计算组合中第一字段值hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;2)变历所有的数据页,从数据页中的data数据项中把组合中第一字段的值取出,与第一字段值进行匹配,获得所有匹配的rowid;3)计算第二字段值的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;4)变历所有的数据页,从数据页中的data数据项中把第二字段的值取出,与第二字段值进行匹配,获得所有匹配的rowid;5)将第二步和第四步得到的rowid进行distinct去重,查看delete-bitmap,除掉已经删除的行,根据rowid来获得查询结果。6.一种根据权利要求2所述基于多个相关字段组合索引存储结构对两个值不相同的字段查询条件为and运算的查询方法,包括:.1)任意指定组合中一字段值为第一字段,计算第一字段字段值的hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;.2)变历所有的数据页,从数据页中的data数据项中把第一字段的值取出,和第一字段值进行匹配,从数据页中data数据项中将第二字段的字段的值取出,和第二字段值进行匹配,两个值都能匹配上,则获得该rowid满足条件;.3)将得到的rowid的结果查看delete-bitmap,去除掉已经删除的行,根据rowid来获得查询结果。7.一种根据权利要求2所述基于多个相关字段组合索引存储结构对两个字段的and条件,其中一个字段的内部条件为or条件的查询条件的值都不相同的运算的查询方法,包括:.1)指定组合中内部无or条件运算的字段为第一字段,计算第一字段字段值hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;.2)变历所有的数据页,从数据页中的data数据项中把第一字段的值取出,和第一字段值进行匹配,将第二字段的值取出,和第二字段or条件的第一值或者第二字段or条件的第二值进行匹配,两个字段的值都能匹配上,则获得该rowid满足条件;.3)将得到的rowid的结果查看delete-bitmap,去除掉已经删除的行,将最终的rowid来获得查询结果。8.一种根据权利要求2所述基于多个相关字段组合索引存储结构的增加数据方法,包括:1)计算组合字段该字段hash值,根据hash值从散列表中查找hash冲突链的数据页的首地址;2)变历所有的数据页,获取空闲页,在空闲数据页写入一行数据,内容为rowid和data,data的内容为第一字段的size及value,各个其余剩余字段的size及value;3)判断该字段是否为组合字段的最后一个字段,如果是则增加过程结束,如果为否,则转入第一步骤。9.一种根据权利要求2所述基于多个相关字段组合索引存储结构的删除数据方法,包括:1)根据查询条件获得需要删除行的rowid;2)根据该rowid,计算出该行在delete-bitmap中的对应位置,设置delete-bitmap对应位置的值为O。10.一种根据权利要求2所述的基于多个相关字段组合索引存储结构的查询方法,包括:.1)根据多个相关字段的查询条件来确定整体的查询条件是or查询还是and查询;.2)当整体的查询条件是or查询时,依次对每一个查询条件进行处理,处理后得到每一个查询条件的结果rowid,对这些结果rowid进行distinct去重后的rowid作为最终rowid,根据最终rowid来获得查询结果;3)当整体的查询条件是and查询时,依次对每一个查询条件进行处理处理后得到每一个查询条件的结果rowid,对得到的所有这些查询条件的结果rowid取交集,然后再对这些结果rowid进行distinct去重后的rowid作为最终rowid,根据最终rowid来获得查询结果。`【文档编号】G06F17/30GK103500183SQ201310415712【公开日】2014年1月8日申请日期:2013年9月12日优先权日:2013年9月12日【发明者】王洋申请人:国家计算机网络与信息安全管理中心
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1