CN116955363B - 无模式数据创建索引方法、装置、计算机设备及介质 - Google Patents

无模式数据创建索引方法、装置、计算机设备及介质 Download PDF

Info

Publication number
CN116955363B
CN116955363B CN202311218843.4A CN202311218843A CN116955363B CN 116955363 B CN116955363 B CN 116955363B CN 202311218843 A CN202311218843 A CN 202311218843A CN 116955363 B CN116955363 B CN 116955363B
Authority
CN
China
Prior art keywords
data
key
block
index
value
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.)
Active
Application number
CN202311218843.4A
Other languages
English (en)
Other versions
CN116955363A (zh
Inventor
于宁
姚延栋
高小明
翁岩青
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Siweizongheng Data Technology Co ltd
Original Assignee
Beijing Siweizongheng Data Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Siweizongheng Data Technology Co ltd filed Critical Beijing Siweizongheng Data Technology Co ltd
Priority to CN202311218843.4A priority Critical patent/CN116955363B/zh
Publication of CN116955363A publication Critical patent/CN116955363A/zh
Application granted granted Critical
Publication of CN116955363B publication Critical patent/CN116955363B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/28Databases characterised by their database models, e.g. relational or object models
    • G06F16/284Relational databases

Abstract

本发明实施例提供了一种无模式数据创建索引方法、装置、计算机设备及介质,涉及数据索引技术领域,方法包括:接收json数据,达到预设行时形成数据块;将数据块内同一个key所对应的原生类型键值分配至同一数据组;对分配完数据组后的数据块生成数据标识,不同数据块所对应的数据标识不同,数据标识用于对数据块进行定位以及与数据块内的数据一一对应;对每个key所对应的键值进行数据范围提取,数据范围包括两个端值;将key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成一条索引信息;将每个key所对应的索引信息以预定索引格式存储。该方案有效提升了数据过滤的效率。

Description

无模式数据创建索引方法、装置、计算机设备及介质
技术领域
本发明涉及数据索引技术领域,特别涉及一种无模式数据创建索引方法、装置、计算机设备及介质。
背景技术
对于普通的数据列,例如建表语句为CREATE TABLE t1 (c1 int);查询对应为WHERE c1 = 10的语句,在默认情况下这样的语句需要对c1进行完整的加载并逐个进行过滤,效率很低。但是在c1这样的普通列上我们可以通过创建索引进行过滤加速,比如CREATEINDEX ON t1 USING btree (c1) 即创建了一个btree类型的索引,当进行WHERE c1 = 10这样的过滤时可以利用此索引高效地找到它出现在哪一个或哪一些位置,这样就可以只对这些位置进行定点扫描,极大降低了扫描开销,从而达到了提升查询效率的目的。
在PostgreSQL这样的数据库中存在多种不同机制的索引,它们有各自不同的特色与优缺点:
btree index,精确型索引,对于数据表上的每一行都需要把其索引键(上面例子中的c1)拷贝到btree索引的内部文件中,在其内部文件中所有的数据以b-tree或b+tree等结构进行存放,逻辑上保证了数据按照索引键即c1有序,这样当进行WHERE c1 = 10这样的查询时可以进行高效的定位。同样支持c1>10或者c1<10这样的过滤条件。其优点是查询效率非常高,且支持多种过滤条件,缺点则是体积较大且无法压缩,当体积大到无法在内存中充分缓存时性能会受到影响。另外每一个btree索引只能处理一列上的高效过滤,比如一个索引idx1是创建在c1列上的,那么它可以处理c1 = 10这样的条件,但无法处理c2 = 10这样的条件,如果想支持此条件就需要额外创建c2列上的idx2索引,即便如此对于WHERE c1>10 AND c2<20这样的复合条件只能在idx1或idx2中二选一,即只能对c1作索引过滤并对c2作逐行过滤,或者反过来对c2作索引过滤并对c1作逐行过滤,这样还是会产生很多不必要的扫描。
hash index,精确型索引,与btree类似,对于数据表上的每一行都需要把其索引键拷贝到hash index内部文件中,区别是在hash index中数据是组织成hash table,这样对于c1 = 10这样的过滤条件可以进行精确的定位。但无法支持非等值过滤条件,比如无法支持c1>10等。hash index的优点是查询效率非常高,缺点是只支持等值过滤,体积同样较大且无法压缩。同样与btree类似的是,一个hash索引只能处理一列上的高效过滤。
brin index,非精确型索引,或者称为范围型索引。btree&hash索引中要求数据表上的每一行都在索引内部有一行与其对应,这就导致了索引大体较大的问题。在brinindex中则是把输入数据视为逻辑块,比如每10万行视为一块,同一块中只需要记录其最大值与最小值即可。这样当遇到WHERE c1 = 10这样的过滤条件时,靠一个逻辑块上的最大与最小值即可判断这一块是否有可能命中,当有可能命中时再把此逻辑块对应的数据实际扫描出来做逐行匹配,这个过程中当然仍然会产生很多不匹配,甚至也存在brin根据最大与最小值认为一个逻辑块可能匹配,但最终并不存在匹配的情况;即便如此,当一个逻辑块根据其最大与最小值认为不满足过滤条件时,其得到的“不满足过滤条件”的结论是可靠的,便不需要加载此逻辑块对应的底层数据,从而实现一定程度上的过滤效果。当数据本身越是有序时brin的过滤效果越好。brin索引也支持c1>10等非等值过滤条件。特别地,一个brin索引可以同时对多个不同的键进行索引,比如CREATE INDEX ON t1 USING brin (c1,c2),那么过滤条件无论是在c1还是c2上,甚至二者同时过滤,都可以利用brin的索引过滤能力。其优点是体积小,支持多列过滤,支持多种过滤条件,缺点则是除非相应的列有序性极强,否则无法做到像精确型索引一样的极致性能。
PostgreSQL数据库中对一般的模式化数据可采用上述3种索引,btree、hash和brin,这些索引各自有其适用的场景,在合理使用的情况下都能对查询性能产生显著的提升效果,但是它们均不适合无模式数据,原因如下:
无模式数据的列具备动态性,无法完整地预知,而所有上述索引都要求在索引创建时即指定固定的索引键;
即便我们对所有已知的key定义了上述固定索引,随着时间的推移也可能遇到新的key,无法被已经存在的索引所覆盖,因此就缺失了过滤的加速能力;
另一方面PostgreSQL中一个索引上最多只能有32列,而无模式数据上完全可以出现成千上万个不同的key,这意味着需要大量的此类标准索引才能对无模式数据进行支持,这完全不具备可行性。
基于这些现实,已有的索引方案均无法用于无模式数据。
发明内容
有鉴于此,本发明实施例提供了一种无模式数据创建索引方法,以解决现有技术中索引方案均无法用于无模式数据的技术问题。该方法包括:
接收json数据,所述json数据达到预设行时形成数据块;
将所述数据块内的同一个key所对应的原生类型的键值分配至同一数据组;
对分配完数据组后的数据块生成数据标识,不同的数据块所对应的数据标识不同,所述数据标识用于对所述数据块进行定位以及与所述数据块内的数据一一对应;
对每个key所对应的数据组中的键值进行数据范围的提取,所述数据范围包括两个端值;
针对每个key,将该key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成该key的一条索引信息;
将每个key所对应的索引信息以预定索引格式存储。
本发明实施例还提供了一种无模式数据创建索引装置,以解决了现有技术中索引方案均无法用于无模式数据的技术问题。该装置包括:
数据块形成模块,用于接收json数据,所述json数据达到预设行时形成数据块;
数据组分配模块,用于将所述数据块内的同一个key所对应的原生类型的键值分配至同一数据组;
数据标识生成模块,用于对分配完数据组后的数据块生成数据标识,不同的数据块所对应的数据标识不同,所述数据标识用于对所述数据块进行定位以及与所述数据块内的数据一一对应;
数据范围提取模块,用于对每个key所对应的数据组中的键值进行数据范围的提取,所述数据范围包括两个端值;
索引信息形成模块,用于针对每个key,将该key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成该key的一条索引信息;
存储模块,用于将每个key所对应的索引信息以预定索引格式存储。
本发明实施例还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任意的无模式数据创建索引方法,以解决了现有技术中索引方案均无法用于无模式数据的技术问题。
本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述任意的无模式数据创建索引方法的计算机程序,以解决了现有技术中索引方案均无法用于无模式数据的技术问题。
与现有技术相比,本说明书实施例采用的上述至少一个技术方案能够达到的有益效果至少包括:接收json数据,json数据达到预设行时形成数据块;将数据块内的同一个key所对应的原生类型的键值分配至同一数据组;对分配完数据组后的数据块生成数据标识,不同的数据块所对应的数据标识不同,数据标识用于对数据块进行定位以及与数据块内的数据一一对应;对每个key所对应的数据组中的键值进行数据范围的提取,数据范围包括两个端值;将一个key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成一条索引信息;将每个key所对应的索引信息以预定索引格式存储。在本申请的创建索引方法中,不但把多行输入视为一个逻辑块并转换成按key汇总的列式数据,而且把这样的列式数据以原生格式存储在固定模式的内部关系表中,进一步为每一个key创建范围型索引信息,当发现对于过滤条件,某一逻辑块一定不会存在匹配时,不需要对此逻辑块中的数据进行实际提取,从而避免了不必要的数据提取,实现高效的数据过滤,极大降低了io读取量并提升了查询的性能,突破了现有技术中的索引方案均无法用于无模式数据的技术问题。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1是本发明实施例提供的一种无模式数据创建索引方法的流程图;
图2是本发明实施例提供的另一种无模式数据创建索引方法的流程图;
图3是本发明实施例提供的一种计算机设备的结构框图;
图4是本发明实施例提供的一种无模式数据创建索引装置的结构框图。
具体实施方式
下面结合附图对本申请实施例进行详细描述。
以下通过特定的具体实例说明本申请的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本申请的其他优点与功效。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。本申请还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本申请的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
PostgreSQL数据库中对一般的模式化数据可采用的3种索引,btree,hash,brin,这些索引各自有其适用的场景,在合理使用的情况下都能对查询性能产生显著的提升效果,但是它们均不适合无模式数据,针对上述问题,本申请提出了一种无模式数据创建索引方法,参照图1,所述方法包括以下步骤:
接收json数据,所述json数据达到预设行时形成数据块;
将所述数据块内的同一个key所对应的原生类型的键值分配至同一数据组;
对分配完数据组后的数据块生成数据标识,不同的数据块所对应的数据标识不同,所述数据标识用于对所述数据块进行定位以及与所述数据块内的数据一一对应;
对每个key所对应的数据组中的键值进行数据范围的提取,所述数据范围包括两个端值;
针对每个key,将该key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成该key的一条索引信息;
将每个key所对应的索引信息以预定索引格式存储。
本实施例中,首先将无模式数据进行逻辑分块,确保每一数据块中有足够多数量的行数,然后通过key分组把每一个key对应的原生类型的值汇集成类似列存的形式,类似k1->{2, 6, 8, 4},这样的数据会再交给数据存储器保存进内部关系表中;在此基础上可以进一步为每一个key创建索引信息,通过在数据存储器内部记录额外的索引信息来实现索引效果,达到高效的数据过滤。
在一个实施例中,所述将所述数据块内的同一个key所对应的原生类型的键值分配至同一数据组,具体包括以下步骤:
所述json数据达到预设行时形成第一数据块;
将所述第一数据块内每个key所对应的键值均转换为原生类型,形成第二数据块;
将所述第二数据块内每个key的keyname转换为keyid,所述keyname为键名,所述keyid为键名编码,不同的keyname所对应的keyid不同;
将所述第二数据块内同一个keyid所对应的所有原生类型的键值分配至同一数据组。
在本实施例中,通过对json数据块中的每个key所对应的键值进行解析转换为原生类型,并对每个key的keyname转换为keyid,对同一keyid所对应的键值进行分组,并对数据块赋予数据标识,在访问数据时,通过数据标识和keyname即可定位查找到相关数据。因此,本实施例把无模式数据存储在有模式的关系表中,但不需要显式指定模式,也不要求固定模式,并且不受到数据库中字段数量的限制;这些数据可以直接被数据库访问,通过数据库执行器中相应的语义识别与下推我们可以把“提取k2”这样的语义转换成原生的关系表上的访问,提升了处理效率。
具体实施时,keyid可设置为1、2、3等的整数的键名编码,进行键名编码时,需要注意,同一个keyname采用同一个键名编码,不同的keyname所对应的键名编码不同,以确保对于一个keyname,其keyid是唯一的。
具体实施时,所述原生类型包括整数型、浮点数型、布尔数据型或者文本数据型。
在上述实施例中,所述将所述第一数据块内每个key所对应的键值均转换为原生类型,形成第二数据块,包括:
对所述第一数据块内的json数据进行逐行解析;
对每行的每个key所对应的键值均转换为原生类型,形成第二数据块。
在一个实施例中,对分配完数据组后的数据块生成数据标识,包括:
所述json数据达到预设行时形成数据块,对所述数据块分配块编号,不同的数据块所对应的块编号不同;
对所述分配完数据组后的数据块基于所述块编号生成数据标识。
在一个实施例中,两个所述端值中的一个端值为每个所述数据组中的键值的最大值,另一个端值为每个所述数据组中的键值的最小值。
当所述数据范围包括两个端值时,所述预定索引格式描述为CREATE INDEX range(blockid int, keyid int, min int, max int),其中,blockid为所述数据标识,min为每个所述数据组中的键值的最小值,max为每个所述数据组中的键值的最大值。
在本实施例中,借助这样的处理,为每个逻辑块(数据块)的每个key多记录两个值,无论逻辑块中有多少行都只记录最大最小两个值,相对于逻辑块中成百上千行的规模这样的两行只增加了非常小的存储开销。
在另一个实施例中,对无模式数据创建索引方法做进一步详细说明,将执行存储数据块的存储器命名为“mxkv2存入器”,执行创建索引的索引器命名为“mxkv2索引器”,参照图2,mxkv2存入器包括分块器、块编号器、json解析器、key转换器、key存储器、key分组器和数据存储器,具体包括以下步骤:
假设用户表定义如下:
CREATE TABLE t1 (id int, kv mxkv2);
并插入如下两行数据:
INSERT INTO t1 values
(1, '{"k1": 11, "k2": 12}'),
(2, '{"k2": 22, "k3": 23}');
[S.IN] 数据库用户或其它数据源向主关系表中插入的json数据,主关系表把这些数据交给mxkv2存入器,也就是 '{"k1": 11, "k2": 12}' 和 '{"k2": 22, "k3": 23}'这样的两个json形式的键值;
[S0] json分块器负责积攒预设行数的json输入行(json数据达到预设行时)成为一个第一数据块,由于mxkv2逻辑上是把数据存储为列存格式,因此需要利用分块器把逐行输入转换为含有多行的数据块。每当积攒好一个足够大的第一数据块后便通过[S1]分配一个唯一的块编号,比如blockid=1000,并将积攒好的数据交给[S2]进行处理,也就是 '{"k1": 11, "k2": 12}, {"k2": 22, "k3": 23}';
[S1] 块编号器负责对每个第一数据块生成唯一的块编号,其必须保证即便在事务回滚时其已经分配出的块编号在后续也不得被重复分配,块编号最终会交给[S6]用于描述物理数据;
[S2] json解析器对第一数据块中的json数据进行逐行解析,对每行的每个key所对应的键值均转换为原生类型,形成第二数据块。一行json内可以含有多个 (keyname,value) 对,keyname为键名,value为键值,逻辑上同一行内的keyname不会重复,但不同的行中可以出现相同的keyname。经过解析后第一数据块内每个key对应的键值都已经转换成原生类型,比如整数、浮点数等。内容仍然是 '{"k1": 11, "k2": 12}, {"k2": 22, "k3":23}',但是形式上已经转换成内存格式,便于后续处理;
[S3] 第一key转换器负责把第二数据块内每个key的keyname转换成keyid,这样可以减少keyname的存储开销,不同的keyname所对应的keyid不同,即同一个keyname总是转换成同一个keyid,这借助[S4]来实现。经过这一处理后第二数据块每一行中的(keyname, value)对都被转换成(keyid, value)对,方便[S5]进行处理。假设 "k1"<->1,"k2"<->2, "k3"<->3,那么[S3]的输出便是 '{[1]->11, [2]->12}, {[2]->22, [3]->23}';
[S4] key存储器负责存储keyname与keyid的对应关系,这通过普通的关系表来实现,其描述keyname<->keyid的双向转换。当一个keyname第一次出现时,其必须被分配一个新的keyid,keyname与keyid必须具备一一对应关系,比如 "k1"<->1, "k2"<->2, "k3"<->3;
[S5] key分组器用来把同一个key的键值汇总在一起,即把第二数据块内同一个keyid所对应的所有原生类型的键值分配至同一数据组,类似 [1]->[11, null], [2]->[12, 22], [3]->[null, 23],这些数据会交给[S6]进行实际的存储,此时所述第二数据块内所有keyid所对应的数据组形成第三数据块。完成存储后在 [S1] 提供的块编号基础上生成一段可与第三数据块中的数据一一对应并可对所述第三数据块进行精确定位的数据标识。由于块编号已经具备唯一性,因此最简单的选择是直接把块编号视为数据标识;
[S6] 把[S5]提供的数据写入存储中(对第三数据块进行存储)。为了用固定的模式保存无模式的数据,本实施例中采用标准的窄表模型,窄表是严格按照数据库设计三范式,窄表方便扩展,能适应各种复杂的数据结构(树形、继承等),无论有多少配置,都不用修改表结构;
先定义一个内部关系表,其模式按照 PostgreSQL 语法可描述为 CREATE TABLEdata (blockid int, keyid int, payload bytea),其中blockid即为 [S5]生成的数据标识,keyid即为[S5]生成的数据中与 "k1"~"k3" 对应的1~3等key编号,payload则是与keyid相对应的原生类型的键值(数据本体)。在本实施例中,相当于在此内部关系表中存入如下3行记录:INSERT INTO data(blockid, keyid, payload) VALUES (1000, 1, [11,null]), (1000, 2, [12, 22]), (1000, 3, [null, 23]);这样对于[S5]提供的示例输出,可以把 k1, k2, k3 的值各自保存成此关系中的一行,其中payload列用于保存此key在数据块中汇总后的值,比如k1的{1, null},k2的{2, 20}等,这些值以原生类型直接拼接的方式进行保存,这样在读取时并不需要额外的转换即可作为原生数据使用;
在数据访问时,通过(blockid=1000)便可高效找到这一数据块中所有key的值,即k1=[11, null], k2=[12, 22], k3=[null, 23];通过(blockid=1000, keyid=2) 则可精确找到这一数据块k2列对应的所有的值k2=[12, 22];通过(blockid=1000, keyid=33)则可以快速判断出此数据块中不存在keyid=33,从而可以返回 [null, null];
[S.OUT] 输出,输出内容为[S5]产生的数据标识,主关系表负责对数据标识进行存储,即主关系表中只需要记录1000这个数据即可;
[I0] 每当有数据交给[S6]中的数据存储器进行存储时,[I0] 的范围提取器都会对其数据进行处理,假设数据标识为blockid=1000,k1对应的keyid为1,那么 [I0]拿到的输入即为 (1000, 1, {2, 6, 8, 4}),我们会提取出其中最小值与最大值的两个值,即(2, 8);
[I1] 索引存储器把 (2, 8) 以及对应的 (blockid, keyid) 共同进行记录,即(1000, 1, 2, 8)。索引存储器本质上是数据库中的一个固定模式的表,比如 CREATEINDEX range (blockid int, keyid int, min int, max int),这样对于每个逻辑块中的每一个key都会记录一条索引信息,比如INSERT INTO range (blockid, keyid, min,max) VALUES (1000, 1, 2, 8)。
本申请的实施例中提出的一种新的索引方法,通过把无模式数据在关系型数据库中存储成原生类型的列式数据的方法,在此基础上为每一个key创建范围型索引信息,并利用此信息实现高效的数据过滤。该索引方法虽然类似brin index,但是适用于无模式数据,不但可以支持动态的模式,还可以支持任意多列,同时只需要极低的存储开销。
在效果方面也与brin index类似,一个key上的数据的顺序性越强则其过滤效果也越强,这一定意义上是此类范围型索引的共同限制。但是有一些场景天然适配范围型索引,比如时序场景中我们记录的是设备的设备编号,时间戮,以及无模式的属性数据,比如冰箱的温度属性,这些属性随着时间会发生变化,但是相邻的时间点上此属性只会发生小幅变化,很少发生跳变,这样一个逻辑块上就对应了这样的一个设备在某个时间段内的属性,这样采用范围型索引足以对其产生有效的逻辑块筛选效果。当然也有一些属性是可以存在跳变的,比如电源的开关状态,也有一些属性是存在短时间快速大幅变化的可能,比如电视的音量,但是考虑到这些变化是极少发生的事件,大部分时间中此类属性都维持不变,因此甚至更加适合范围型索引。
本申请还提供一种无模式数据过滤方法,以解决现有技术中索引方案均无法用于无模式数据的技术问题。该方法包括以下步骤:
获取一个key的过滤条件;
根据所述key在预定索引格式存储的数据中寻找与所述key对应的数据组的端值,其中,所述预定索引格式存储的数据包括每个key所对应的索引信息,针对每个key所述索引信息包括该key、与该key对应的数据组的端值以及该key所在数据块的数据标识,所述数据组内包含同一个key所对应的所有的原生类型的键值,所述数据标识用于对所述数据块进行定位以及与所述数据块内的数据一一对应;
根据与所述key对应的数据组的端值判断与所述key对应的数据组内是否存在与所述过滤条件相匹配的数据;
若存在与所述过滤条件相匹配的数据,则根据所述过滤条件对与所述key对应的数据组进行数据提取,若不存在与所述过滤条件相匹配的数据,则结束对所述key的数据过滤。
具体实施时,取出过程分为两种情况,如果查询中不含有kv上的过滤语义那么完全按照如下步骤的取出过程进行执行即可,该取出过程包括:
获取数据标识和key的keyname,所述keyname为键名,所述数据标识用于对数据块进行定位以及与所述数据块内的数据一一对应,所述数据块内的数据包括多个数据组,每个数据组包括一个keyid以及与该keyid对应的所有原生类型的键值,所述keyid为与所述keyname一一对应的键名编码;
将所述keyname转换为与所述keyname对应的keyid;
根据所述数据标识和所述keyid在所述数据块内定位并加载对应的数据;
将所述数据以原生类型进行输出。
但如果查询中存在kv上的过滤语义,比如为了找到k1的值小于10时的k2,用户可以写出如下查询:SELECT kv->’k2’ FROM t1 WHERE kv->’k1’<10, 具体的过程如下:
执行器负责识别并下推此语义至mxkv2中(获取一个key的过滤条件);
mxkv2在从数据存储器读取给定key的数据时即可根据此信息从索引存储器(mxkv2索引器)中找到相应的(min, max),即根据所述key在预定索引格式存储的数据中寻找与所述key对应的数据组的端值;
并根据找到的相应的(min, max)判断一个逻辑块中是否可能存在与过滤条件匹配数据。在上面的例子中我们希望找到k1<10 的数据,但假如一个逻辑块的(min, max)为(20, 30)那么我们就知道这一块中所有的数据都不会小于20,当然也就不会满足 k1<10这一条件,因此这一逻辑块一定不会存在匹配,不需要对此逻辑块中的数据进行实际提取。用户层面不同的过滤条件需要翻译成索引存储器上不同的形式,参照如下示例:
k1 = 10: block.min<= 10<= block.max。用户查询中的 kv->’k1’ = 10 被翻译成索引存储器上的 min<= 10 and 10<= max,只有满足此条件的逻辑块才需要实际提取出数据,否则可以直接跳过;
k1<10: block.min<10。用户查询中的 kv->’k1’<10 被翻译成索引存储器上的min<10;
k1<= 10: block.min<= 10。用户查询中的 kv->’k1’<=10 被翻译成索引存储器上的min<= 10;
k1>10: block.max>10。用户查询中的 kv->’k1’>10 被翻译成索引存储器上的max>10;
k1>= 10: block.max>= 10。用户查询中的 kv->’k1’>=10 被翻译成索引存储器上的max>= 10;
如果一个逻辑块不满足上述转换后的条件则可以忽略此块上数据的加载,因此我们可以100%推断逻辑块上不存在匹配;如果一个逻辑块满足上述转换后的条件,则需要对此数据块进行加载,执行器会负责逐行判断加载出的内容是否真的满足原始的过滤条件,即 kv->’k1’<10。
在具体实施时,在时序场景中利用这样的范围型索引机制可以产生非常好的过滤效果,极大降低了io读取量并提升了查询的性能。
在本实施例中,提供了一种计算机设备,如图3所示,包括存储器301、处理器302及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任意的无模式数据创建索引方法。
具体的,该计算机设备可以是计算机终端、服务器或者类似的运算装置。
在本实施例中,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述任意的无模式数据创建索引方法的计算机程序。
具体的,计算机可读存储介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机可读存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读存储介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
基于同一发明构思,本发明实施例中还提供了一种无模式数据创建索引装置,如下面的实施例所述。由于无模式数据创建索引装置解决问题的原理与无模式数据存储方法相似,因此无模式数据创建索引装置的实施可以参见无模式数据创建索引方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图4是本发明实施例的无模式数据创建索引装置的一种结构框图,如图4所示,包括:数据块形成模块401、数据组分配模块402、数据标识生成模块403、数据范围提取模块404、索引信息形成模块405和存储模块406,下面对该结构进行说明。
数据块形成模块401,用于接收json数据,所述json数据达到预设行时形成数据块;
数据组分配模块402,用于将所述数据块内的同一个key所对应的原生类型的键值分配至同一数据组;
数据标识生成模块403,用于对分配完数据组后的数据块生成数据标识,不同的数据块所对应的数据标识不同,所述数据标识用于对所述数据块进行定位以及与所述数据块内的数据一一对应;
数据范围提取模块404,用于对每个key所对应的数据组中的键值进行数据范围的提取,所述数据范围包括两个端值;
索引信息形成模块405,用于针对每个key,将该key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成该key的一条索引信息;
存储模块406,用于将每个key所对应的索引信息以预定索引格式存储。
具体实施时,数据组分配模块402,还用于所述json数据达到预设行时形成第一数据块;将所述第一数据块内每个key所对应的键值均转换为原生类型,形成第二数据块;将所述第二数据块内每个key的keyname转换为keyid,所述keyname为键名,所述keyid为键名编码,不同的keyname所对应的keyid不同;将所述第二数据块内同一个keyid所对应的所有原生类型的键值分配至同一数据组。
具体实施时,在数据范围提取模块404中,两个所述端值中的一个端值为每个所述数据组中的键值的最大值,另一个端值为每个所述数据组中的键值的最小值。
具体实施时,在存储模块406中,所述预定索引格式描述为CREATE INDEX range(blockid int, keyid int, min int, max int),其中,blockid为所述数据标识,min为每个所述数据组中的键值的最小值,max为每个所述数据组中的键值的最大值。
具体实施时,数据标识生成模块403,还用于所述json数据达到预设行时形成数据块,对所述数据块分配块编号,不同的数据块所对应的块编号不同;对所述分配完数据组后的数据块基于所述块编号生成数据标识。
本发明实施例实现了如下技术效果:接收json数据,json数据达到预设行时形成数据块;将数据块内的同一个key所对应的原生类型的键值分配至同一数据组;对分配完数据组后的数据块生成数据标识,不同的数据块所对应的数据标识不同,数据标识用于对数据块进行定位以及与数据块内的数据一一对应;对每个key所对应的数据组中的键值进行数据范围的提取,数据范围包括两个端值;将一个key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成一条索引信息;将每个key所对应的索引信息以预定索引格式存储。在本申请的创建索引方法中,不但把多行输入视为一个逻辑块并转换成按key汇总的列式数据,而且把这样的列式数据以原生格式存储在固定模式的内部关系表中,进一步为每一个key创建范围型索引信息,当发现对于过滤条件,某一逻辑块一定不会存在匹配时,不需要对此逻辑块中的数据进行实际提取,从而避免了不必要的数据提取,实现高效的数据过滤,极大降低了io读取量并提升了查询的性能,突破了现有技术中的索引方案均无法用于无模式数据的技术问题。
显然,本领域的技术人员应该明白,上述的本发明实施例的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明实施例不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (6)

1.一种无模式数据创建索引方法,其特征在于,包括:
接收json数据,所述json数据达到预设行时形成数据块;
将所述数据块内的同一个key所对应的原生类型的键值分配至同一数据组,包括:所述json数据达到预设行时形成第一数据块;将所述第一数据块内每个key所对应的键值均转换为原生类型,形成第二数据块;将所述第二数据块内每个key的keyname转换为keyid,所述keyname为键名,所述keyid为键名编码,不同的keyname所对应的keyid不同;将所述第二数据块内同一个keyid所对应的所有原生类型的键值分配至同一数据组;
对分配完数据组后的数据块生成数据标识,不同的数据块所对应的数据标识不同,所述数据标识用于对所述数据块进行定位以及与所述数据块内的数据一一对应;
对每个key所对应的数据组中的键值进行数据范围的提取,所述数据范围包括两个端值,两个所述端值中的一个端值为每个所述数据组中的键值的最大值,另一个端值为每个所述数据组中的键值的最小值;
针对每个key,将该key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成该key的一条索引信息;
将每个key所对应的索引信息以预定索引格式存储。
2.如权利要求1所述的无模式数据创建索引方法,其特征在于,所述预定索引格式描述为CREATE INDEX range (blockid int, keyid int, min int, max int),其中,blockid为所述数据标识,min为每个所述数据组中的键值的最小值,max为每个所述数据组中的键值的最大值。
3.如权利要求1所述的无模式数据创建索引方法,其特征在于,对分配完数据组后的数据块生成数据标识,包括:
所述json数据达到预设行时形成数据块,对所述数据块分配块编号,不同的数据块所对应的块编号不同;
对所述分配完数据组后的数据块基于所述块编号生成数据标识。
4.一种无模式数据创建索引装置,其特征在于,包括:
数据块形成模块,用于接收json数据,所述json数据达到预设行时形成数据块;
数据组分配模块,用于将所述数据块内的同一个key所对应的原生类型的键值分配至同一数据组,包括:所述json数据达到预设行时形成第一数据块;将所述第一数据块内每个key所对应的键值均转换为原生类型,形成第二数据块;将所述第二数据块内每个key的keyname转换为keyid,所述keyname为键名,所述keyid为键名编码,不同的keyname所对应的keyid不同;将所述第二数据块内同一个keyid所对应的所有原生类型的键值分配至同一数据组;
数据标识生成模块,用于对分配完数据组后的数据块生成数据标识,不同的数据块所对应的数据标识不同,所述数据标识用于对所述数据块进行定位以及与所述数据块内的数据一一对应;
数据范围提取模块,用于对每个key所对应的数据组中的键值进行数据范围的提取,所述数据范围包括两个端值,两个所述端值中的一个端值为每个所述数据组中的键值的最大值,另一个端值为每个所述数据组中的键值的最小值;
索引信息形成模块,用于针对每个key,将该key、与该key对应的数据组的端值以及该key所在数据块的数据标识所组成的信息形成该key的一条索引信息;
存储模块,用于将每个key所对应的索引信息以预定索引格式存储。
5.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至3中任一项所述的无模式数据创建索引方法。
6.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有执行权利要求1至3中任一项所述的无模式数据创建索引方法的计算机程序。
CN202311218843.4A 2023-09-21 2023-09-21 无模式数据创建索引方法、装置、计算机设备及介质 Active CN116955363B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311218843.4A CN116955363B (zh) 2023-09-21 2023-09-21 无模式数据创建索引方法、装置、计算机设备及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311218843.4A CN116955363B (zh) 2023-09-21 2023-09-21 无模式数据创建索引方法、装置、计算机设备及介质

Publications (2)

Publication Number Publication Date
CN116955363A CN116955363A (zh) 2023-10-27
CN116955363B true CN116955363B (zh) 2023-12-26

Family

ID=88451483

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311218843.4A Active CN116955363B (zh) 2023-09-21 2023-09-21 无模式数据创建索引方法、装置、计算机设备及介质

Country Status (1)

Country Link
CN (1) CN116955363B (zh)

Citations (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1873642A (zh) * 2006-04-29 2006-12-06 上海世纪互联信息系统有限公司 具有自动分类功能的搜索引擎
CN102955843A (zh) * 2012-09-20 2013-03-06 北大方正集团有限公司 一种键值数据库的多键查找实现方法
CN105122243A (zh) * 2013-03-15 2015-12-02 亚马逊科技公司 用于半结构化数据的可扩展分析平台
CN110188096A (zh) * 2019-04-18 2019-08-30 阿里巴巴集团控股有限公司 一种数据记录的索引创建方法、装置及设备
CN111078705A (zh) * 2019-12-20 2020-04-28 南京聚力云成电子科技有限公司 基于Spark平台建立数据索引方法及数据查询方法
WO2020211569A1 (zh) * 2019-04-18 2020-10-22 创新先进技术有限公司 一种数据记录的索引创建方法
CN113227998A (zh) * 2018-12-28 2021-08-06 甲骨文国际公司 全面支持自主json文档对象(ajd)云服务的技术
CN114077609A (zh) * 2022-01-19 2022-02-22 北京四维纵横数据技术有限公司 数据存储及检索方法,装置,计算机可读存储介质及电子设备
CN114153394A (zh) * 2021-11-30 2022-03-08 浙江大华技术股份有限公司 一种数据存储管理方法、装置及设备
CN115374129A (zh) * 2022-10-24 2022-11-22 杭州欧若数网科技有限公司 一种数据库联合索引编码方法和系统
CN115374121A (zh) * 2022-08-26 2022-11-22 北京人大金仓信息技术股份有限公司 数据库索引的生成方法、机器可读存储介质与计算机设备
CN115422194A (zh) * 2022-09-01 2022-12-02 上海焜耀网络科技有限公司 一种用于数据库索引构建的方法与设备
WO2023083234A1 (zh) * 2021-11-11 2023-05-19 支付宝(杭州)信息技术有限公司 图状态数据管理
CN116244313A (zh) * 2023-05-08 2023-06-09 北京四维纵横数据技术有限公司 Json数据存储和访问方法、装置、计算机设备及介质

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1625740A (zh) * 2002-07-23 2005-06-08 三星电子株式会社 元数据的索引结构、提供元数据索引的方法、以及使用元数据的索引的元数据搜索方法和装置
US8458191B2 (en) * 2010-03-15 2013-06-04 International Business Machines Corporation Method and system to store RDF data in a relational store
US9495398B2 (en) * 2011-02-18 2016-11-15 International Business Machines Corporation Index for hybrid database
US8732213B2 (en) * 2011-12-23 2014-05-20 Amiato, Inc. Scalable analysis platform for semi-structured data
GB201210234D0 (en) * 2012-06-12 2012-07-25 Fujitsu Ltd Reconciliation of large graph-based data storage
WO2014031618A2 (en) * 2012-08-22 2014-02-27 Bitvore Corp. Data relationships storage platform
EP3646193B1 (en) * 2017-06-30 2023-03-15 Microsoft Technology Licensing, LLC Online schema change of range-partitioned index in distributed storage system
US11042526B2 (en) * 2018-09-27 2021-06-22 Software Ag Systems and/or methods for database storage using binary large objects to guarantee reduced complexity

Patent Citations (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1873642A (zh) * 2006-04-29 2006-12-06 上海世纪互联信息系统有限公司 具有自动分类功能的搜索引擎
CN102955843A (zh) * 2012-09-20 2013-03-06 北大方正集团有限公司 一种键值数据库的多键查找实现方法
CN105122243A (zh) * 2013-03-15 2015-12-02 亚马逊科技公司 用于半结构化数据的可扩展分析平台
CN113227998A (zh) * 2018-12-28 2021-08-06 甲骨文国际公司 全面支持自主json文档对象(ajd)云服务的技术
CN110188096A (zh) * 2019-04-18 2019-08-30 阿里巴巴集团控股有限公司 一种数据记录的索引创建方法、装置及设备
WO2020211569A1 (zh) * 2019-04-18 2020-10-22 创新先进技术有限公司 一种数据记录的索引创建方法
CN111078705A (zh) * 2019-12-20 2020-04-28 南京聚力云成电子科技有限公司 基于Spark平台建立数据索引方法及数据查询方法
WO2023083234A1 (zh) * 2021-11-11 2023-05-19 支付宝(杭州)信息技术有限公司 图状态数据管理
CN114153394A (zh) * 2021-11-30 2022-03-08 浙江大华技术股份有限公司 一种数据存储管理方法、装置及设备
CN114077609A (zh) * 2022-01-19 2022-02-22 北京四维纵横数据技术有限公司 数据存储及检索方法,装置,计算机可读存储介质及电子设备
CN115374121A (zh) * 2022-08-26 2022-11-22 北京人大金仓信息技术股份有限公司 数据库索引的生成方法、机器可读存储介质与计算机设备
CN115422194A (zh) * 2022-09-01 2022-12-02 上海焜耀网络科技有限公司 一种用于数据库索引构建的方法与设备
CN115374129A (zh) * 2022-10-24 2022-11-22 杭州欧若数网科技有限公司 一种数据库联合索引编码方法和系统
CN116244313A (zh) * 2023-05-08 2023-06-09 北京四维纵横数据技术有限公司 Json数据存储和访问方法、装置、计算机设备及介质

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
云计算环境下支持复杂查询的多维数据索引机制;朱夏;罗军舟;宋爱波;东方;;计算机研究与发展(08);全文 *

Also Published As

Publication number Publication date
CN116955363A (zh) 2023-10-27

Similar Documents

Publication Publication Date Title
CN102129458B (zh) 关系型数据库的存储方法及装置
CA1214284A (en) Sparse array bit map used in data bases
CN110362572A (zh) 一种基于列式存储的时序数据库系统
CN1542657A (zh) 用于分层数据格式的数据库模型
CN110990402B (zh) 由行存储到列存储的格式转化方法、查询方法及装置
CN106326387B (zh) 一种分布式数据存储结构及数据存储方法和数据查询方法
US20140046928A1 (en) Query plans with parameter markers in place of object identifiers
JP2001043237A (ja) データファイル及びデータ検索方法
CN111078702A (zh) 一种sql语句分类管理及统一查询方法和装置
US6490591B1 (en) Apparatus and method for storing complex structures by conversion of arrays to strings
CN116756253B (zh) 关系型数据库的数据存储、查询方法、装置、设备和介质
CN106777111B (zh) 一种超大规模数据的时序检索索引系统及方法
Bancilhon et al. Design of a backend processor for a data base machine
CN116955363B (zh) 无模式数据创建索引方法、装置、计算机设备及介质
CN111045994B (zh) 一种基于kv数据库的文件分类检索方法及系统
CN101000621A (zh) 一种ims数据库互动式访问方法和工具
CN115495462A (zh) 批量数据更新方法、装置、电子设备和可读存储介质
CN116975067B (zh) 无模式数据存储方法、装置、计算机设备及介质
CN107861956B (zh) 一种卡口过车数据记录的查询方法及装置
US7162505B2 (en) Classification of data for insertion into a database
US10325106B1 (en) Apparatus and method for operating a triple store database with document based triple access security
CN111767436A (zh) 一种hash索引数据的存储、读取方法与系统
RU2389066C2 (ru) Многомерная база данных и способ управления многомерной базой данных
CN116955403B (zh) 无模式数据运算加速方法、装置、计算机设备及介质
CN117725095B (zh) 面向数据集的数据存储和查询方法、装置、设备及介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant