一种位图索引的写入/转储/合并/查询方法和装置
技术领域
本发明涉及计算机技术领域,特别涉及一种位图索引的写入/转储/合并/查询方法和装置。
背景技术
位图索引,是一种基于位图建立的数据库索引,适用于有大量重复值的列查询。在实际应用场景中,随着数据库中存储的数据不断更新,为了适应查询的需求,位图索引也需要随之更新。
目前,在对位图索引进行更新时,会把更新行所在的数据块整体加锁。通常数据块包含成百上千行的数据,更新位图索引中单行会导致整个数据块的其他不相关行被锁住,导致无法对该数据块中的其他行进行更新。
因此,现有的方法并发更新性能低。
发明内容
鉴于此,本发明实施例提供了一种位图索引的写入/转储/合并/查询方法和装置,能够提高并发更新性能。
第一方面,本发明实施例提供了一种位图索引的写入方法,包括:
根据更新数据,确定位图索引Memtable的更新行;
对所述位图索引Memtable的更新行添加行锁;
根据所述更新数据,更新所述位图索引Memtable的更新行中的数据。
第二方面,本发明实施例提供了一种位图索引的转储方法,包括:
根据更新数据,确定位图索引Memtable的更新行;
对所述位图索引Memtable的更新行添加行锁;
根据所述更新数据,更新所述位图索引Memtable的更新行中的数据;
释放所述位图索引Memtable的更新行的行锁;
将所述位图索引Memtable中的数据写入新的位图索引转储SSTable中。
第三方面,本发明实施例提供了一种位图索引的合并方法,包括:
根据更新数据,确定位图索引Memtable的更新行和主表Memtable的更新行;
对所述位图索引Memtable的更新行和所述主表Memtable的更新行添加行锁;
根据所述更新数据,更新所述位图索引Memtable的更新行中的数据和所述主表Memtable的更新行中的数据;
释放所述位图索引Memtable的更新行的行锁和所述主表Memtable的更新行的行锁;
将所述位图索引Memtable中的数据写入新的位图索引转储SSTable中,将所述主表Memtable中的数据写入新的主表转储SSTable中;
根据所述新的主表转储SSTable,确定位图索引基线SSTable中的数据。
第四方面,本发明实施例提供了一种位图索引的查询方法,包括:
根据更新数据,确定位图索引Memtable的更新行和主表Memtable的更新行;
对所述位图索引Memtable的更新行和所述主表Memtable的更新行添加行锁;
根据所述更新数据,更新所述位图索引Memtable的更新行中的数据和所述主表Memtable的更新行中的数据;
释放所述位图索引Memtable的更新行的行锁和所述主表Memtable的更新行的行锁;
将所述位图索引Memtable中的数据写入新的位图索引转储SSTable中,将所述主表Memtable中的数据写入新的主表转储SSTable中;
将所述新的主表转储SSTable中的数据写入新的主表基线SSTable中;
根据所述新的主表基线SSTable,确定位图索引基线SSTable中的数据;其中,所述位图索引Memtable、所述新的位图索引转储SSTable和所述位图索引基线SSTable构成一个位图索引;
根据查询条件,在一个或多个所述位图索引中进行查询,得到查询结果。
第五方面,本发明实施例提供了一种位图索引的写入装置,包括:
确定单元,用于根据更新数据,确定位图索引Memtable的更新行;
加锁单元,用于对所述位图索引Memtable的更新行添加行锁;
更新单元,用于根据所述更新数据,更新所述位图索引Memtable的更新行中的数据。
第六方面,本发明实施例提供了一种位图索引的转储装置,包括:
确定单元,用于根据更新数据,确定位图索引Memtable的更新行;
加锁单元,用于对所述位图索引Memtable的更新行添加行锁;
更新单元,用于根据所述更新数据,更新所述位图索引Memtable的更新行中的数据;
释放单元,用于释放所述位图索引Memtable的更新行的行锁;
转储单元,用于将所述位图索引Memtable中的数据写入新的位图索引转储SSTable中。
第七方面,本发明实施例提供了一种位图索引的合并装置,包括:
确定单元,用于根据更新数据,确定位图索引Memtable的更新行和主表Memtable的更新行;
加锁单元,用于对所述位图索引Memtable的更新行和所述主表Memtable的更新行添加行锁;
更新单元,用于根据所述更新数据,更新所述位图索引Memtable的更新行中的数据和所述主表Memtable的更新行中的数据;
释放单元,用于释放所述位图索引Memtable的更新行的行锁和所述主表Memtable的更新行的行锁;
转储单元,用于将所述位图索引Memtable中的数据写入新的位图索引转储SSTable中,将所述主表Memtable中的数据写入新的主表转储SSTable中;
合并单元,用于根据所述新的主表转储SSTable,确定位图索引基线SSTable中的数据。
第八方面,本发明实施例提供了一种位图索引的查询装置,包括:
确定单元,用于根据更新数据,确定位图索引Memtable的更新行和主表Memtable的更新行;
加锁单元,用于对所述位图索引Memtable的更新行和所述主表Memtable的更新行添加行锁;
更新单元,用于根据所述更新数据,更新所述位图索引Memtable的更新行中的数据和所述主表Memtable的更新行中的数据;
释放单元,用于释放所述位图索引Memtable的更新行的行锁和所述主表Memtable的更新行的行锁;
转储单元,用于将所述位图索引Memtable中的数据写入新的位图索引转储SSTable中,将所述主表Memtable中的数据写入新的主表转储SSTable中;
合并单元,用于将所述新的主表转储SSTable中的数据写入新的主表基线SSTable中;根据所述新的主表基线SSTable,确定位图索引基线SSTable中的数据;其中,所述位图索引Memtable、所述新的位图索引转储SSTable和所述位图索引基线SSTable构成一个位图索引;
查询单元,用于根据查询条件,在一个或多个所述位图索引中进行查询,得到查询结果。
本发明实施例采用的上述至少一个技术方案能够达到以下有益效果:该方法在位图索引的更新过程中,对位图索引Memtable的更新行添加行锁,实现行级加锁。因此,该方法能够减小加锁范围,避免锁住更新行所在的数据块,进而提高位图索引的并发更新性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一个实施例提供的一种位图索引的写入方法的流程图;
图2是本发明一个实施例提供的一种位图索引Memtable的结构示意图;
图3是本发明一个实施例提供的一种位图索引的转储方法的流程图;
图4是本发明一个实施例提供的一种位图索引的合并方法的流程图;
图5是本发明一个实施例提供的一种主表的结构示意图;
图6是本发明一个实施例提供的一种位图索引的结构示意图;
图7是本发明一个实施例提供的一种位图索引的查询方法的流程图;
图8是本发明一个实施例提供的一种位图索引的写入装置的结构示意图;
图9是本发明一个实施例提供的一种位图索引的转储装置的结构示意图;
图10是本发明一个实施例提供的一种位图索引的合并装置的结构示意图;
图11是本发明一个实施例提供的一种位图索引的查询装置的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明实施例提供了一种位图索引的写入方法,该方法可以包括以下步骤:
步骤101:根据更新数据,确定位图索引Memtable的更新行。
位图索引Memtable和主表Memtable为能够实现行级加锁的存储结构,例如,B+树、Bw树等。可以根据更新数据的主表主键列和索引列(即索引表主键列)确定位图索引Memtable的更新行,并为其添加行锁。
步骤102:对位图索引Memtable的更新行添加行锁。
步骤103:根据更新数据,更新位图索引Memtable的更新行中的数据。
步骤103具体包括:确定更新数据的主表主键列的列值和索引列的列值;将更新数据的主表主键列的列值和索引列的列值,写入位图索引Memtable的更新行中。
位图索引Memtable中每行存储的是索引列和主表主键列的列值,并按照这些列值排序。如图2所示,是一种B+树结构的位图索引Memtable,内部包含多个节点,其中叶子节点存储行数据。
例如,主表字段为(a,b),a是主表主键列,b是索引列(即以b列建立位图索引)。参考图6,位图索引Memtable的存储顺序为(b,a),图中i代表插入,d代表删除。
在实际应用场景中,位图索引的写入过程可以通过事务的执行实现,具体为:开启事务,步骤101-步骤103,提交事务。其中,在提交事务后,即数据更新完成后,还包括:释放位图索引Memtable的更新行的行锁。
该方法在位图索引的更新过程中,对位图索引Memtable的更新行添加行锁,实现行级加锁。因此,该方法能够减小加锁范围,避免锁住更新行所在的数据块,进而提高位图索引的并发更新性能。
主表的写入方法与位图索引的写入方法类似,主表的写入方法包括:
a1:根据更新数据,确定主表Memtable的更新行。
a2:对主表Memtable的更新行添加行锁。
a3:根据更新数据,更新主表Memtable的更新行中的数据。
与位图索引Memtable不同的是,主表Memtable中存储更新数据的所有列的列值。并且,在主表Memtable中,数据的存储顺序为(a,b),参考图5所示。
需要说明的是,为了保证主表与位图索引中数据的一致性,主表或位图索引在写入的过程中,主表和位图索引都需要加行锁,但是加锁之后,可以先向主表中写入数据,也可以先向位图索引中写入数据,还可以同时向主表和位图索引中写入数据,在主表和位图索引的数据写入都完成后,再释放主表和位图索引添加的行锁。
在此情况下,步骤102具体包括:对位图索引Memtable的更新行和主表Memtable的更新行添加行锁。下述步骤302与步骤102类似,此处不再赘述。
类似地,a2具体包括:对位图索引Memtable的更新行和主表Memtable的更新行添加行锁。下述c2与a2类似,此处不再赘述。
对应于加锁,解锁也存在相同的处理过程。
下述步骤304具体包括:释放位图索引Memtable的更新行的行锁和主表Memtable的更新行的行锁;
下述c4具体包括:释放位图索引Memtable的更新行的行锁和主表Memtable的更新行的行锁。如图3所示,本发明实施例提供了一种位图索引的转储方法,包括:
步骤301:根据更新数据,确定位图索引Memtable的更新行。
步骤302:对位图索引Memtable的更新行添加行锁。
步骤303:根据更新数据,更新位图索引Memtable的更新行中的数据。
步骤301-步骤303同上述步骤101-步骤103,此处不再赘述。
步骤304:释放位图索引Memtable的更新行的行锁。
在写入过程完成后,释放相关的行锁,以接触对资源的占用。
步骤305:将位图索引Memtable中的数据写入新的位图索引转储SSTable中。
新的位图索引转储SSTable由一个或多个宏块组成,每个宏块中包含位图索引字段部分或全部数据,数据一旦写入就不再更新。
新的位图索引转储SSTable的存储顺序为(b,a),具体请参考图6。
宏块中包含一行或多行已排序的数据,每个宏块的存储的数据量可以预先配置,例如,宏块的大小为2M。宏块持久化在磁盘上,是SSTable的基本组成单位。其中,SSTable包括转储SSTable和基线SSTable(主表、位图索引)。
步骤305具体包括:
b1:冻结位图索引Memtable。
在对位图索引Memtable中的数据转储至新的位图索引转储SSTable之前,需要冻结位图索引Memtable,以禁止新的数据写入到该位图索引Memtable。
b2:按照新的位图索引转储SSTable的宏块格式,将冻结的位图索引Memtable中的数据写入新的位图索引转储SSTable中。
在不存在旧的位图索引转储SSTable时,直接将按照新的位图索引转储SSTable的宏块格式,将冻结的位图索引Memtable中的数据写入新的位图索引转储SSTable中。
在存在旧的位图索引转储SSTable时,b2具体包括:
b21:根据索引列和主表主键列,合并旧的位图索引转储SSTable和冻结的位图索引Memtable的行。
按照主表主键列和索引列迭代旧的位图索引转储SSTable和冻结的位图索引Memtable的行,合并相同的行。
b22:按照新的位图索引转储SSTable的宏块格式,将合并后的数据写入新的位图索引转储SSTable中。
在b2之后,解除对位图索引Memtable的冻结。
为了避免影响其他更新数据的写入,在b1之后,b2之前还可以包括:创建新的位图索引Memtable。
主表的转储方法与位图索引的转储方法类似,主表的转储方法包括:
cl:根据更新数据,确定主表Memtable的更新行。
c2:对主表Memtable的更新行添加行锁。
c3:根据更新数据,更新主表Memtable的更新行中的数据。
c4:释放主表Memtable的更新行的行锁。
c5:将主表Memtable中的数据写入新的主表转储SSTable中。
新的主表转储SSTable由一个或多个宏块组成,每个宏块中包含主表字段部分或全部数据,数据一旦写入就不再更新。新的主表转储SSTable的存储顺序为(a,b),具体请参考图5。
c5具体包括:
c51:冻结主表Memtable。
c52:按照新的主表转储SSTable的宏块格式,将冻结的主表Memtable中的数据写入新的主表转储SSTable中。
c52具体包括:
c521:根据索引列和主表主键列,合并旧的主表转储SSTable和冻结的主表Memtable的行。
c522:按照新的主表转储SSTable的宏块格式,将合并后的数据写入新的主表转储SSTable中。
如图4所示,本发明实施例提供了一种位图索引的合并方法,包括:
步骤401:根据更新数据,确定位图索引Memtable的更新行和主表Memtable的更新行。
步骤402:对位图索引Memtable的更新行和主表Memtable的更新行添加行锁。
步骤403:根据更新数据,更新位图索引Memtable的更新行中的数据和主表Memtable的更新行中的数据。
步骤404:释放位图索引Memtable的更新行的行锁和主表Memtable的更新行的行锁。
步骤405:将位图索引Memtable中的数据写入新的位图索引转储SSTable中,将主表Memtable中的数据写入新的主表转储SSTable中。
步骤401-步骤405为主表的转储及位图索引的转储,此处不再赘述。
步骤406:根据新的主表转储SSTable,确定位图索引基线SSTable中的数据。
步骤406具体包括:
d1:按照新的主表基线SSTable的宏块格式,将新的主表转储SSTable中的数据写入新的主表基线SSTable中。
d2:根据新的主表基线SSTable,生成位图索引基线SSTable的位图。
即根据新的主表基线SSTable的索引列的列值,生成与新的主表基线SSTable的索引列的列值相对应的位图。
位图索引基线SSTable中以位图的格式存储数据。参考图5和图6,列b有三个不同的列值,分别为1、2和3,每个不同的列值会生成相应的位图,每个位图的第n位为1,则说明第n行列b的值为该位图代表的值。以b=3的位图为例,第6、7行为1,则说明主表的第6行和第7行列b的值皆为3。
d3:按照位图索引基线SSTable的宏块格式,将位图索引基线SSTable的位图写入位图索引基线SSTable中。
d1具体包括:
d11:根据索引列和主表主键列,合并旧的主表基线SSTable和新的主表转储SSTable的行。
d12:按照新的主表基线SSTable的宏块格式,将合并后的数据写入新的主表基线SSTable中。
位图索引基线SSTable由一个或多个宏块组成,每个宏块包含位图索引字段部分或全部数据,数据一旦写入就不再更新。
新的主表基线SSTable由一个或多个宏块组成,每个宏块包含主表字段部分或全部数据,数据一旦写入就不再更新。
如图7所示,本发明实施例提供了一种位图索引的查询方法,包括:
步骤701:根据更新数据,确定位图索引Memtable的更新行和主表Memtable的更新行。
步骤702:对位图索引Memtable的更新行和主表Memtable的更新行添加行锁。
步骤703:根据更新数据,更新位图索引Memtable的更新行中的数据和主表Memtable的更新行中的数据。
步骤704:释放位图索引Memtable的更新行的行锁和主表Memtable的更新行的行锁。
步骤705:将位图索引Memtable中的数据写入新的位图索引转储SSTable中,将主表Memtable中的数据写入新的主表转储SSTable中。
步骤706:将新的主表转储SSTable中的数据写入新的主表基线SSTable中。
步骤707:根据新的主表基线SSTable,确定位图索引基线SSTable中的数据;其中,位图索引Memtable、新的位图索引转储SSTable和位图索引基线SSTable构成一个位图索引。
参考图6,位图索引由位图索引Memtable、新的位图索引转储SSTable和位图索引基线SSTable构成。主表由主表Memtable、新的主表转储SSTable和新的主表基线SSTable构成。通过一张主表可以建立多个位图索引,每个位图索引对应不同的索引列。
步骤708:根据查询条件,在一个或多个位图索引中进行查询,得到查询结果。
查询结果可能由主表Memtable、新的主表转储SSTable和新的主表基线SSTable任意一个或多个中的数据构成。因此,在实际应用场景中,需要对相应的位图索引Memtable、新的位图索引转储SSTable和位图索引基线SSTable分别进行查询。
查询过程可以被划分为两种情况,一种是查询单列,另一种是查询多列。每一种情况又分别对应两种应用场景,一种应用场景是存在增量数据,位图索引Memtable和新的位图索引转储SSTable中的数据为增量数据,当存在增量数据时,需要在位图索引Memtable和/或新的位图索引转储SSTable中进行查询;另一种场景是不存在增量数据,如果不存在增量数据,则不需要查询位图索引Memtable和新的位图索引转储SSTable。
在本发明实施例中,为了加快查询速度,该方法还包括:划分所述新的主表基线SSTable的主键列的列值,得到至少两个分片主键范围。
由于不同的分片主键范围可能对应不同的应用场景,因此通过将主键范围划分成不同的分片主键范围,能够对不同分片主键范围的查询进行区分,对于不存在增量数据的分片主键范围,无需在位图索引Memtable和所述新的位图索引转储SSTable中进行查询,能够提高查询速度。在实际应用场景中,可以根据主表基线SSTable的宏块范围,划分所述新的主表基线SSTable的主键列的列值,例如,宏块1的主键列的列值的范围为1-7,宏块1的主键列的列值的范围为8-14,则分片主键范围1为1-7,分片主键范围2为8-14。
例如,主键列的列值的范围为1-10,分片主键范围1为(小于1),分片主键范围2为(1-5),分片主键范围3为(6-10),分片主键范围4为(大于10)。分片主键范围1和分片主键范围4的存在是防止查询过程中遗漏位图索引Memtable或新的位图索引转储SSTable中的数据。
以下将根据划分得到的分片主键范围对上述两种情况进行详细说明。
情况1:查询单列。
所述根据查询条件,在一个所述位图索引中进行查询,得到查询结果,包括:
el:当所述位图索引Memtable和所述新的位图索引转储SSTable中不存在处于所述当前分片主键范围内的数据时,根据所述查询条件,在所述位图索引基线SSTable的当前分片主键范围内查询,得到所述当前分片主键范围的第一基线SSTable结果位图。
根据所述查询条件,在所述位图索引基线SSTable的当前分片主键范围内查询,得到所述当前分片主键范围的第一基线SSTable结果位图,具体包括:
e11:在所述位图索引基线SSTable的当前分片主键范围内,确定满足所述查询条件的索引列的列值对应的位图。
e12:对满足所述查询条件的索引列的列值对应的位图进行按位或运算,得到所述第一基线SSTable结果位图。
由于不同的分片主键范围的查询过程相同,以下实施例仅以一个分片主键范围的查询为例
参考图6,假设查询条件为b≤2,则满足查询条件的索引列的列值为1和2。列值1对应的位图为11001001,列值2对应的位图为00110000。
列值1对应的位图与列值2对应的位图进行按位或运算,得到第一基线SSTable结果位图为11111001。
e2:根据所述第一基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第一基线SSTable结果行集合;其中,所述第一基线SSTable结果行集合为所述当前分片主键范围的第一最终结果行集合。
在新的主表基线SSTable中查询基线SSTable结果位图中标记为1的行,得到第一基线SSTable结果行集合。
e3:当所述位图索引Memtable或所述新的位图索引转储SSTable中存在处于所述当前分片主键范围内的数据时,根据所述查询条件,在所述位图索引基线SSTable的当前分片主键范围内查询,得到所述当前分片主键范围的第一基线SSTable结果位图。
e4:根据所述查询条件,在所述新的位图索引转储SSTable的当前分片主键范围内查询,得到所述当前分片主键范围的第一转储SSTable结果行集合。
e5:根据所述查询条件,在所述位图索引Memtable的当前分片主键范围内查询,得到所述当前分片主键范围的第一Memtable结果行集合。
e6:根据所述第一基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第一基线SSTable结果行集合。
e7:确定所述第一基线SSTable结果行集合、所述第一转储SSTable结果行集合和所述第一Memtable结果行集合的并集,得到所述当前分片主键范围的第一最终结果行集合。
由于第一基线SSTable结果行集合、第一转储SSTable结果行集合和第一Memtable结果行集合都是按照主表主键列有序排列,因此,可以通过依次迭代各个集合的行进行归并得到第一最终结果行集合。
e8:确定所述查询结果为各个所述分片主键范围的第一最终结果行集合的并集。
其中,e1-e2对应于分片主键范围内不存在增量数据的应用场景,e3-e7对应于分片主键范围内存在增量数据的应用场景,而e8是将各个分片主键范围的结果合并,得到最终的查询结果。
e3与e1类似,此处不再赘述。
e4具体包括:
e41:在所述新的位图索引转储SSTable的当前分片主键范围内,确定满足所述查询条件的行集合。
根据索引列在新的位图索引转储SSTable中进行二分查找,得到满足查询条件的行集合。根据行的标记不同,对满足查询条件的行集合中的行分别进行处理。其中,e42为标记为删除的行的处理过程,e43为标记为插入的行的处理过程。
e42:若满足所述查询条件的行集合中的当前行标记为删除,则查询所述新的主表基线SSTable是否存在所述当前行,如果是,删除所述当前分片主键范围的基线SSTable结果位图中所述当前行对应的位,否则,从所述行集合中删除所述当前行。
如果新的主表基线SSTable不存在当前行,说明该行在转储中插入后又删除了,则将从行集合中删除当前行。
e43:若满足所述查询条件的行集合中的当前行标记为插入,则查询所述新的主表基线SSTable是否存在所述当前行,如果是,从所述行集合中删除所述当前行,否则,不做任何处理。
如果新的主表基线SSTable不存在当前行,则不做任何处理。
e44:更新后的满足所述查询条件的行集合为所述第一转储SSTable结果行集合。
当满足查询条件的行集合中的所有行均完成e42或e43时,行集合中剩下的行构成第一转储SSTable结果行集合。
e5具体包括:
e51:在所述位图索引Memtable的当前分片主键范围内,确定满足所述查询条件的行集合。
按照索引列在位图索引Memtable(例如,B+树)中进行查找,得到满足条件的行集合。与e2相似,根据行集合中的行的标记对各个行进行处理。
e52:若满足所述查询条件的行集合中的当前行标记为删除,则查询所述新的主表基线SSTable是否存在所述当前行,如果是,删除所述基线SSTable结果位图中所述当前行对应的位,否则,从所述行集合中删除所述当前行。
如果新的主表基线SSTable不存在当前行,则说明该行在转储中插入后又删除了,则从行集合中删除当前行。
e53:若满足所述查询条件的行集合中的当前行标记为插入,则查询所述新的主表基线SSTable是否存在所述当前行,如果是,从所述行集合中删除所述当前行。
如果新的主表基线SSTable不存在当前行,则不做任何处理。
e54:更新后的满足所述查询条件的行集合为所述第一Memtable结果行集合。
当满足查询条件的行集合中的所有行均完成e52或e53时,行集合中剩下的行构成Memtable结果行集合。
上述对单列查询的说明,同样适用于下述查询多列的情况。
情况2:查询多列。
根据查询条件的不同,情况2又可以进一步分为多列取并集和多列取交集两种情况。以查询两列为例,两列取并集的查询条件可以为a≥3或b>5,两列取交集的查询条件可以为a≥3且b>5。
与查询单列相似的是,查询多列也可以通过划分得到的分片主键范围进行查询。此时,该方法还包括:划分所述新的主表基线SSTable的主键列的列值,得到至少两个分片主键范围。
(1)当所述查询条件为各个所述位图索引的索引列的交集时,
所述根据查询条件,在多个所述位图索引中进行查询,得到查询结果,包括:
f1:当各个所述位图索引的位图索引Memtable和新的位图索引转储SSTable中均不存在处于所述当前分片主键范围内的数据时,根据所述查询条件,在各个所述位图索引的位图索引基线SSTable的当前分片主键范围内查询,得到各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图。
f2:对各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图进行按位与运算,得到所述当前分片主键范围的第二基线SSTable结果位图。
f3:根据所述第二基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第二基线SSTable结果行集合;其中,所述第二基线SSTable结果行集合为所述当前分片主键范围的第二最终结果行集合。
f4:当任一所述位图索引的位图索引Memtable和新的位图索引转储SSTable中存在处于所述当前分片主键范围内的数据时,根据所述查询条件,确定各个所述位图索引的当前分片主键范围的第一最终结果行集合。
f5:确定所述当前分片主键范围的第二最终结果行集合为各个所述位图索引的当前分片主键范围的第一最终结果行集合的交集。
f6:确定所述查询结果为各个所述分片主键范围的第二最终结果行集合的并集。
其中,f1-f3对应于分片主键范围内不存在增量数据的应用场景,f4-f5对应于分片主键范围内存在增量数据的应用场景,而f6是将各个分片主键范围的结果合并,得到最终的查询结果。
(2)取并集
该方法还包括:划分所述新的主表基线SSTable的主键列的列值,得到至少两个分片主键范围。
当所述查询条件为各个所述位图索引的索引列的并集时,
所述根据查询条件,在多个所述位图索引中进行查询,得到查询结果,包括:
g1:当各个所述位图索引的位图索引Memtable和新的位图索引转储SSTable中均不存在处于所述当前分片主键范围内的数据时,根据所述查询条件,在各个所述位图索引的位图索引基线SSTable的当前分片主键范围内查询,得到各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图。
g2:对各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图进行按位或运算,得到所述当前分片主键范围的第三基线SSTable结果位图。
g3:根据所述第三基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第三基线SSTable结果行集合;其中,所述第三基线SSTable结果行集合为所述当前分片主键范围的第三最终结果行集合。
g4:当任一所述位图索引的位图索引Memtable和新的位图索引转储SSTable中存在处于所述当前分片主键范围内的数据时,根据所述查询条件,确定各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图、各个所述位图索引的当前分片主键范围的第一转储SSTable结果行集合和各个所述位图索引的当前分片主键范围的第一Memtable结果行集合。
g5:对各个所述位图索引的当前分片主键范围的基线SSTable结果位图进行按位或运算,得到所述当前分片主键范围的第三基线SSTable结果位图。
g6:确定当前位图索引的当前分片主键范围的第一转储SSTable结果行集合和所述当前位图索引的当前分片主键范围的第一Memtable结果行集合的并集,得到所述当前位图索引的当前分片主键范围的增量数据结果行集合。
将各个所述位图索引作为当前位图索引执行g6。
g7:确定各个所述位图索引的当前分片主键范围的增量数据结果行集合的并集,得到所述当前分片主键范围的增量数据结果行集合。
g8:根据所述第三基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第三基线SSTable结果行集合。
g9:确定所述当前分片主键范围的增量数据结果行集合与所述当前分片主键范围的第三基线SSTable结果行集合的并集,得到所述当前分片主键范围的第三最终结果行集合。
g10:确定所述查询结果为各个所述分片主键范围的第三最终结果行集合的并集。
其中,g1-g3对应于分片主键范围内不存在增量数据的应用场景,g4-g9对应于分片主键范围内存在增量数据的应用场景,而g10是将各个分片主键范围的结果合并,得到最终的查询结果。
在查询多列,多列取交集或并集的过程中,对于不存在增量数据的分片主键范围,可以直接通过位图进行按位或运算/按位与计算,与使用结果行集合进行取并集或交集相比,其查询速度更快。
需要说明的是,在实际应用场景中还可以不区分应用场景,在查询的过程中依次查询位图索引的基线SSTable、转储SSTable和Memtable。例如,在查询多列的过程中,且查询条件为各个所述位图索引的索引列的并集时,还可以确定各个所述位图索引的当前分片主键范围的第一最终结果行集合,各个所述位图索引的当前分片主键范围的第一最终结果行集合的并集为当前分片主键范围的查询结果,各个分片主键范围的查询结果的并集为多列查询的查询结果。
如图8所示,一种位图索引的写入装置,包括:
确定单元801,用于根据更新数据,确定位图索引Memtable的更新行;
加锁单元802,用于对位图索引Memtable的更新行添加行锁;
更新单元803,用于根据更新数据,更新位图索引Memtable的更新行中的数据。
在本发明的一个实施例中,更新单元803,用于确定更新数据的主表主键列的列值和索引列的列值;将更新数据的主表主键列的列值和索引列的列值,写入位图索引Memtable的更新行中。
如图9所示,本发明实施例提供了一种位图索引的转储装置,包括:
确定单元901,用于根据更新数据,确定位图索引Memtable的更新行;
加锁单元902,用于对位图索引Memtable的更新行添加行锁;
更新单元903,用于根据更新数据,更新位图索引Memtable的更新行中的数据;
释放单元904,用于释放位图索引Memtable的更新行的行锁;
转储单元905,用于将位图索引Memtable中的数据写入新的位图索引转储SSTable中。
在本发明的一个实施例中,转储单元905,用于冻结位图索引Memtable;按照新的位图索引转储SSTable的宏块格式,将冻结的位图索引Memtable中的数据写入新的位图索引转储SSTable中。
在本发明的一个实施例中,转储单元905,用于根据索引列和主表主键列,合并旧的位图索引转储SSTable和冻结的位图索引Memtable的行;按照新的位图索引转储SSTable的宏块格式,将合并后的数据写入新的位图索引转储SSTable中。
如图10所示,本发明提供了一种位图索引的合并装置,包括:
确定单元1001,用于根据更新数据,确定位图索引Memtable的更新行和主表Memtable的更新行;
加锁单元1002,用于对位图索引Memtable的更新行和主表Memtable的更新行添加行锁;
更新单元1003,用于根据更新数据,更新位图索引Memtable的更新行中的数据和主表Memtable的更新行中的数据;
释放单元1004,用于释放位图索引Memtable的更新行的行锁和主表Memtable的更新行的行锁;
转储单元1005,用于将位图索引Memtable中的数据写入新的位图索引转储SSTable中,将主表Memtable中的数据写入新的主表转储SSTable中;
合并单元1006,用于根据新的主表转储SSTable,确定位图索引基线SSTable中的数据。
在本发明的一个实施例中,合并单元1006,用于按照新的主表基线SSTable的宏块格式,将新的主表转储SSTable中的数据写入新的主表基线SSTable中;根据新的主表基线SSTable,生成位图索引基线SSTable的位图;按照位图索引基线SSTable的宏块格式,将位图索引基线SSTable的位图写入位图索引基线SSTable中。
在本发明的一个实施例中,合并单元1006,用于根据索引列和主表主键列,合并旧的主表基线SSTable和新的主表转储SSTable的行;按照新的主表基线SSTable的宏块格式,将合并后的数据写入新的主表基线SSTable中。
如图11,本发明实施例提供了一种位图索引的查询装置,包括:
确定单元1101,用于根据更新数据,确定位图索引Memtable的更新行和主表Memtable的更新行;
加锁单元1102,用于对位图索引Memtable的更新行和主表Memtable的更新行添加行锁;
更新单元1103,用于根据更新数据,更新位图索引Memtable的更新行中的数据和主表Memtable的更新行中的数据;
释放单元1104,用于释放位图索引Memtable的更新行的行锁和主表Memtable的更新行的行锁;
转储单元1105,用于将位图索引Memtable中的数据写入新的位图索引转储SSTable中,将主表Memtable中的数据写入新的主表转储SSTable中;
合并单元1106,用于将新的主表转储SSTable中的数据写入新的主表基线SSTable中;根据新的主表基线SSTable,确定位图索引基线SSTable中的数据;其中,位图索引Memtable、新的位图索引转储SSTable和位图索引基线SSTable构成一个位图索引;
查询单元1107,用于根据查询条件,在一个或多个位图索引中进行查询,得到查询结果。
在本发明的一个实施例中,该装置还包括:划分单元,用于划分所述新的主表基线SSTable的主键列的列值,得到至少两个分片主键范围;
所述查询单元1107,用于当所述位图索引Memtable和所述新的位图索引转储SSTable中不存在处于所述当前分片主键范围内的数据时,根据所述查询条件,在所述位图索引基线SSTable的当前分片主键范围内查询,得到所述当前分片主键范围的第一基线SSTable结果位图;根据所述第一基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第一基线SSTable结果行集合;其中,所述第一基线SSTable结果行集合为所述当前分片主键范围的第一最终结果行集合;
当所述位图索引Memtable或所述新的位图索引转储SSTable中存在处于所述当前分片主键范围内的数据时,根据所述查询条件,在所述位图索引基线SSTable的当前分片主键范围内查询,得到所述当前分片主键范围的第一基线SSTable结果位图;根据所述查询条件,在所述新的位图索引转储SSTable的当前分片主键范围内查询,得到所述当前分片主键范围的第一转储SSTable结果行集合;根据所述查询条件,在所述位图索引Memtable的当前分片主键范围内查询,得到所述当前分片主键范围的第一Memtable结果行集合;根据所述第一基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第一基线SSTable结果行集合;确定所述第一基线SSTable结果行集合、所述第一转储SSTable结果行集合和所述第一Memtable结果行集合的并集,得到所述当前分片主键范围的第一最终结果行集合;
确定所述查询结果为各个所述分片主键范围的第一最终结果行集合的并集。
在本发明的一个实施例中,所述查询单元1107,用于在所述位图索引基线SSTable的当前分片主键范围内,确定满足所述查询条件的索引列的列值对应的位图;对满足所述查询条件的索引列的列值对应的位图进行按位或运算,得到所述第一基线SSTable结果位图。
在本发明的一个实施例中,所述查询单元1107,用于在所述新的位图索引转储SSTable的当前分片主键范围内,确定满足所述查询条件的行集合;若满足所述查询条件的行集合中的当前行标记为删除,则查询所述新的主表基线SSTable是否存在所述当前行,如果是,删除所述当前分片主键范围的基线SSTable结果位图中所述当前行对应的位,否则,从所述行集合中删除所述当前行;若满足所述查询条件的行集合中的当前行标记为插入,则查询所述新的主表基线SSTable是否存在所述当前行,如果是,从所述行集合中删除所述当前行;更新后的满足所述查询条件的行集合为所述第一转储SSTable结果行集合。
在本发明的一个实施例中,所述查询单元1107,用于在所述位图索引Memtable的当前分片主键范围内,确定满足所述查询条件的行集合;若满足所述查询条件的行集合中的当前行标记为删除,则查询所述新的主表基线SSTable是否存在所述当前行,如果是,删除所述基线SSTable结果位图中所述当前行对应的位,否则,从所述行集合中删除所述当前行;若满足所述查询条件的行集合中的当前行标记为插入,则查询所述新的主表基线SSTable是否存在所述当前行,如果是,从所述行集合中删除所述当前行;更新后的满足所述查询条件的行集合为所述第一Memtable结果行集合。
在本发明的一个实施例中,该装置还包括:划分单元,用于划分所述新的主表基线SSTable的主键列的列值,得到至少两个分片主键范围;
所述查询单元1107,用于当所述查询条件为各个所述位图索引的索引列的交集、各个所述位图索引的位图索引Memtable和新的位图索引转储SSTable中均不存在处于所述当前分片主键范围内的数据时,根据所述查询条件,在各个所述位图索引的位图索引基线SSTable的当前分片主键范围内查询,得到各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图;对各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图进行按位与运算,得到所述当前分片主键范围的第二基线SSTable结果位图;根据所述第二基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第二基线SSTable结果行集合;其中,所述第二基线SSTable结果行集合为所述当前分片主键范围的第二最终结果行集合;
当任一所述位图索引的位图索引Memtable和新的位图索引转储SSTable中存在处于所述当前分片主键范围内的数据时,根据所述查询条件,确定各个所述位图索引的当前分片主键范围的第一最终结果行集合;确定所述当前分片主键范围的第二最终结果行集合为各个所述位图索引的当前分片主键范围的第一最终结果行集合的交集;
确定所述查询结果为各个所述分片主键范围的第二最终结果行集合的并集。
在本发明的一个实施例中,该装置还包括:划分单元,用于划分所述新的主表基线SSTable的主键列的列值,得到至少两个分片主键范围;
所述查询单元1107,用于当所述查询条件为各个所述位图索引的索引列的并集、各个所述位图索引的位图索引Memtable和新的位图索引转储SSTable中均不存在处于所述当前分片主键范围内的数据时,根据所述查询条件,在各个所述位图索引的位图索引基线SSTable的当前分片主键范围内查询,得到各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图;对各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图进行按位或运算,得到所述当前分片主键范围的第三基线SSTable结果位图;根据所述第三基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第三基线SSTable结果行集合;其中,所述第三基线SSTable结果行集合为所述当前分片主键范围的第三最终结果行集合;
当任一所述位图索引的位图索引Memtable和新的位图索引转储SSTable中存在处于所述当前分片主键范围内的数据时,根据所述查询条件,确定各个所述位图索引的当前分片主键范围的第一基线SSTable结果位图、各个所述位图索引的当前分片主键范围的第一转储SSTable结果行集合和各个所述位图索引的当前分片主键范围的第一Memtable结果行集合;对各个所述位图索引的当前分片主键范围的基线SSTable结果位图进行按位或运算,得到所述当前分片主键范围的第三基线SSTable结果位图;确定当前位图索引的当前分片主键范围的第一转储SSTable结果行集合和所述当前位图索引的当前分片主键范围的第一Memtable结果行集合的并集,得到所述当前位图索引的当前分片主键范围的增量数据结果行集合;确定各个所述位图索引的当前分片主键范围的增量数据结果行集合的并集,得到所述当前分片主键范围的增量数据结果行集合;根据所述第三基线SSTable结果位图,查询所述新的主表基线SSTable,得到所述当前分片主键范围的第三基线SSTable结果行集合;确定所述当前分片主键范围的增量数据结果行集合与所述当前分片主键范围的第三基线SSTable结果行集合的并集,得到所述当前分片主键范围的第三最终结果行集合;
确定所述查询结果为各个所述分片主键范围的第三最终结果行集合的并集。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个......”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。