CN110020001A - 字符串数据的存储、查询方法以及相应的设备 - Google Patents
字符串数据的存储、查询方法以及相应的设备 Download PDFInfo
- Publication number
- CN110020001A CN110020001A CN201711482415.7A CN201711482415A CN110020001A CN 110020001 A CN110020001 A CN 110020001A CN 201711482415 A CN201711482415 A CN 201711482415A CN 110020001 A CN110020001 A CN 110020001A
- Authority
- CN
- China
- Prior art keywords
- data
- string data
- string
- identification information
- prefix trees
- 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.)
- Pending
Links
- 238000003860 storage Methods 0.000 title claims abstract description 56
- 238000000034 method Methods 0.000 title claims description 36
- 238000010276 construction Methods 0.000 claims description 11
- 230000029058 respiratory gaseous exchange Effects 0.000 claims 2
- 230000006835 compression Effects 0.000 abstract description 15
- 238000007906 compression Methods 0.000 abstract description 15
- 230000006837 decompression Effects 0.000 abstract description 11
- 230000014759 maintenance of location Effects 0.000 abstract description 3
- 230000015654 memory Effects 0.000 description 18
- 241001269238 Data Species 0.000 description 8
- 230000008901 benefit Effects 0.000 description 5
- 230000006870 function Effects 0.000 description 5
- 238000013500 data storage Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 238000013507 mapping Methods 0.000 description 3
- 238000004590 computer program Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
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/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9027—Trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90344—Query processing by using string matching techniques
Abstract
本申请提供了一种字符串数据存储、查询的方案,该方案利用前缀树能共享共同前缀的特点,在不使用LZ4等传统压缩算法的情况下直接减少存储的数据量,而在查询时由于数据未进行过压缩,无需进行解压即可直接查找,同时利用前缀树的查找功能,其查找效率会明显高于解压后逐条遍历的常规方式,在不引入索引的情况下,可以快速过滤不满足查询条件的数据包,大大降低了查询执行时间,并且由于建立了字符串数据逻辑位置与标识信息的关联关系,规避了前缀树无法存储重复的字符串带来的问题,即使数据表中有多个逻辑位置的字符串数据的内容相同,也能够正常实现存储和查询。
Description
技术领域
本申请涉及信息技术领域,尤其涉及一种字符串数据的存储、查询方法以及相应的设备。
背景技术
在数据库中,为了节省存储成本,一般数据都是切分成若干个数据包(DataPack),然后再经过LZ4等压缩算法压缩之后存储在磁盘之中的。LZ4等传统算法压缩率较好,压缩解压速度快,能够大大降低数据库的空间使用,从而降低数据保存成本。然而在读取数据时,但是由于查询语句无法直接操作压缩数据,在查询数据时需要先对数据进行解压,然后再检查所有记录来寻找符合条件的记录,这大大增加了查询执行时间。
另一方面,有些数据库为了加速查询语句执行时间,会为数据创建独立索引,然而这些索引也会占用磁盘空间,会增加数据存储的成本,访问索引也会带来更多磁盘读写,并且索引也需要缓存在内存中,这大大增加了占用的内存。
申请内容
本申请的一个目的是提供一种字符串数据的存储、查询方案,用以解决现有技术中查询执行时间较长的问题。
为实现上述目的,本申请提供了一种字符串数据的存储方法,该方法包括:
将字符串数据构建为前缀树;
为所述字符串数据分配对应的标识信息,所述标识信息用于从所述前缀树中确定对应的字符串数据;
将所述字符串数据对应的标识信息与所述字符串数据在数据表中的逻辑位置建立关联关系。
进一步地,将字符串数据构建为前缀树之后,还包括:
将所述前缀树的内容以紧凑格式的数据进行存储,其中,所述紧凑格式的数据包括:前缀树中每个节点的字符、关于每个节点的子节点情况的第一信息以及每个节点是否为字符串数据的最后一个字符的第二信息。
进一步地,为所述字符串数据分配的标识信息与所述第二信息相关。
进一步地,将字符串数据构建为前缀树,包括:
为每个数据包的字符串数据生成一个前缀树。
进一步地,所述字符串数据为列式数据库中的数据;
将所述字符串数据对应的标识信息与所述字符串数据在数据表中的逻辑位置建立关联关系,包括:
将所述字符串数据对应的标识信息与所述字符串数据在数据表中的行号建立关联关系。
本申请还提供了一种字符串数据的查询方法,该方法包括:
获取查询请求,所述查询请求包含字符串数据的查询条件;
根据所述查询条件,在前缀树中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息;
根据字符串数据存储时建立的关联关系,确定本次查询的标识信息对应的字符串数据在数据表中的逻辑位置。
进一步地,根据所述查询条件,在前缀树中查找符合所述查询条件的字符串数据,包括:
根据所述查询条件,在前缀树的内容对应的紧凑格式的数据中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息,其中,所述紧凑格式的数据包括:前缀树中每个节点的字符、关于每个节点的子节点情况的第一信息以及每个节点是否为字符串数据的最后一个字符的第二信息。
进一步地,所述字符串数据的标识信息与所述第二信息相关。
进一步地,根据所述查询条件,在前缀树中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息,包括:
根据所述查询条件,依次在每个数据包对应的前缀树中查找符合所述查询条件的字符串数据,直至获取所述字符串数据的标识信息。
进一步地,所述字符串数据为列式数据库中的数据;
确定本次查询的标识信息对应的字符串数据在数据表中的逻辑位置,包括:
确定本次查询的标识信息对应的字符串数据在数据表中的行号。
基于本申请的另一方面,还提供了一种字符串数据的存储设备,该存储设备包括:
数据构建装置,用于将字符串数据构建为前缀树,并为所述字符串数据分配对应的标识信息,所述标识信息用于从所述前缀树中确定对应的字符串数据;
关联装置,用于将所述字符串数据对应的标识信息与所述字符串数据在数据表中的逻辑位置建立关联关系。
进一步地,所述数据构建装置,还用于在将字符串数据构建为前缀树之后,将所述前缀树的内容以紧凑格式的数据进行存储,其中,所述紧凑格式的数据包括:前缀树中每个节点的字符、关于每个节点的子节点情况的第一信息以及每个节点是否为字符串数据的最后一个字符的第二信息。
进一步地,所述数据构建装置为所述字符串数据分配的标识信息与所述第二信息相关。
进一步地,所述数据构建装置,用于为每个数据包的字符串数据生成一个前缀树。
进一步地,所述字符串数据为列式数据库中的数据;
所述关联装置,用于将所述字符串数据对应的标识信息与所述字符串数据在数据表中的行号建立关联关系。
本申请还提供了一种字符串数据的查询设备,该查询设备包括:
请求获取装置,用于获取查询请求,所述查询请求包含字符串数据的查询条件;
匹配查询装置,用于根据所述查询条件,在前缀树中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息,并根据字符串数据存储时建立的关联关系,确定本次查询的标识信息对应的字符串数据在数据表中的逻辑位置。
进一步地,所述匹配查询装置,用于根据所述查询条件,在前缀树的内容对应的紧凑格式的数据中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息,其中,所述紧凑格式的数据包括:前缀树中每个节点的字符、关于每个节点的子节点情况的第一信息以及每个节点是否为字符串数据的最后一个字符的第二信息。
进一步地,所述字符串数据的标识信息与所述第二信息相关。
进一步地,每个前缀树对应一个数据包的字符串数据;
所述匹配查询装置,用于根据所述查询条件,依次在各个数据包对应的前缀树中查找符合所述查询条件的字符串数据,直至获取所述字符串数据的标识信息。
进一步地,所述字符串数据为列式数据库中的数据;
所述匹配查询装置,用于确定本次查询的标识信息对应的字符串数据在数据表中的行号。
本申请还提供了一种设备,其中,该设备包括:
处理器;以及
存储有机器可读指令的一个或多个机器可读介质,当所述处理器执行所述机器可读指令时,使得所述设备执行前述的存储或查询方法。
本申请提供的方案中,在存储字符串数据时,首先将字符串数据构建为前缀树,然后为所述字符串数据分配对应的标识信息,使得通过该标识信息可以从所述前缀树中确定对应的字符串数据,并且将所述字符串数据对应的标识信息与所述字符串数据在数据表中的逻辑位置建立关联关系。对于字符串数据来说利用前缀树能共享共同前缀的特点,在不使用LZ4等传统压缩算法的情况下直接减少存储的数据量,而在查询时由于数据未进行过压缩,无需进行解压即可直接查找,同时利用前缀树的查找功能,其查找效率会明显高于解压后逐条遍历的常规方式,在不引入索引的情况下,可以快速过滤不满足查询条件的数据包,大大降低了查询执行时间,并且由于建立了字符串数据逻辑位置与标识信息的关联关系,规避了前缀树无法存储重复的字符串带来的问题,即使数据表中有多个逻辑位置的字符串数据的内容相同,也能够正常实现存储和查询。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
图1为本申请实施例中构建的前缀树的示意图;
图2为本申请实施例中前缀树的紧凑格式的数据中三部分内容的对应关系示意图;
图3为本申请实施例中一种适用于列式数据库的存储方案的原理示意图;
图4为本申请实施例提供的一种数据查询方案的示意图;
图5为本申请实施例提供的一种用于实现字符串数据存储或查询的设备的结构示意图;
附图中相同或相似的附图标记代表相同或相似的部件。
具体实施方式
下面结合附图对本申请作进一步详细描述。
在本申请一个典型的配置中,终端、服务网络的设备均包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的装置或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
本申请实施例提供了一种字符串数据的存储方法,在采用该方法存储字符串数据时,首先需要将字符串数据构建为前缀树。例如以三个字符串数据has、have、hot为例,为其构建的前缀树如图1所示,其根节点为super节点,该节点的内容为空,由于has、have、hot的第一个字符均为h,则第一层的子节点仅有h节点,has和have的第二个字符都会a,而hot的第二个字符为o,则第二层的子节点分别为a、o,依次类推第三层的子节点为s、v和t,第四层的节点仅有e。
由于前缀树的优点在于能够在查询时最大限度地减少无谓的字符串比较,查询效率较高,对于字符串数据来说,利用前缀树能共享共同前缀的特点,其查找效率会明显高于解压后逐条遍历的常规方式,在不引入索引的情况下,可以快速过滤不满足查询条件的数据包,大大降低了查询执行时间。
同时,当存储的字符串数据的数据量很大时,会有大量的字符串数据共享共同的前缀,由此表示这些字符串数据的节点数量会远小于所有字符串数据的总长度,因此在不使用LZ4等传统压缩算法的情况下也可以减少存储的数据量,而在查询时由于数据未进行过压缩,无需进行解压即可直接查找,也可以减少查询的执行时间。
但是,在使用前缀树存储字符串数据时会存在一个问题,即前缀树无法存储重复的字符串,当数据表中的第6个和第10个的字符串数据均为相同时,例如均为have,而前缀树中仅能够存储一个have。由此,本申请实施例中的存储方法在实现时,会为字符串数据分配对应的标识信息,使得通过该标识信息可以从前缀树中确定对应的字符串数据,并且将字符串数据对应的标识信息与字符串数据在数据表中的逻辑位置建立关联关系。由此,本方案规避了前缀树无法存储重复的字符串带来的问题,即使数据表中有多个逻辑位置的字符串数据的内容相同,也能够正常实现存储和查询。
在本申请实施例中,逻辑位置是指某一数据在数据表中的位置信息,可以是该数据在数据表中的行号和/或列号等。例如,为字符串数据have分配了一个标识信息ID3,通过该ID3能够在前缀树中快速查找到have,而数据表中的逻辑位置(数据表中的第6个和第10个)与该ID3建立有关联关系,因而用户在查询数据表中某一逻辑位置的数据时,可以先从该逻辑位置中读取标识信息,然后由标识信息在前缀树中找到对应的字符串数据。
在基于前述存储方法对字符串数据进行存储之后,本申请实施例还提供了一种字符串数据的查询方法,该方法包括:
获取查询请求,该查询请求包含字符串数据的查询条件。查询条件可以以数据库查询语句的形式,例如是SQL(Structured Query Language,结构化查询语言)语句“select*from table where string='abcd'”,表示查询数据表中abcd所在的逻辑位置。
在现有的方案中,需要将数据包解压之后,然后逐条其中的字符串数据。而在本实施例的方案中,采用了前缀树加上标识信息关联的方式,可以根据查询条件,在前缀树中查找符合查询条件的字符串数据,获取字符串数据的标识信息,然后根据字符串数据存储时建立的关联关系,确定本次查询的标识信息对应的字符串数据在数据表中的逻辑位置。
由于字符串的匹配是比较费时的,而整型数据的匹配相对较为快速,为了进一步增加查询的速度,可以将字符串数据的标识信息的数据类型设定为整型数据,由此可以在匹配其与逻辑位置的关联关系时,提高处理的速度。
在实际场景中,若直接以前缀树的正常形式进行存储,由于每个节点都会需要存储节点对象的指针,而每个节点的指针都会需要一定的存储空间来进行存储,当字符串数据的数据量很大时,由于节点数也会相应增加,因此也会有一个较大的存储资源开支会用于指针数据的存储。为了减少这部分的存储资源,本申请实施例的方案中,会将前缀树的内容以紧凑格式的数据进行存储,该紧凑格式的数据无需使用指针,包括以下三部分内容:
1、前缀树中每个节点的字符。
仍以前述has、have、hot的字符串数据为例,可以在bases中保存这些节点的字符,由上至下由左至右依次为:super、h、a、o、s、v、t、e。
2、关于每个节点的子节点情况的第一信息。
例如以LOUDS(Level-order unary degree sequence)位图的形式来表示每个节点的子节点情况的第一信息时,可以是:101101101001000,每个0用于区分各个节点,0之前的1数量表示该子节点的数量。即super节点对应的内容为10,表示super节点有一个子节点h;h节点对应的内容为110,表示h节点有两个子节点a、o;a节点对应的内容为110,表示a节点有两个子节点s、v;o节点对应的内容为10,表示o节点有一个子节点t;s节点对应的内容为0,表示s节点没有子节点;v节点对应的内容为10,表示v节点有一个子节点e;t和e节点对应的内容为0,表示t和e节点没有子节点。
3、每个节点是否为字符串数据的最后一个字符的第二信息。
例如以Terminals位图的形式来表示每个节点是否为字符串数据的最后一个字符的第二信息,可以是:00001011。每个节点对应一个bit的数据,1表示该节点是字符串数据的最后一个字符,0表示该节点不是字符串数据的最后一个字符。由于字符串数据分别为has、have、hot,由此s、t和e节点对应的内容都是1,其余节点对应的内容均为0。
图2示出了紧凑格式的数据中三部分内容的对应关系,通过上述三部分内容可以完整表示出前缀树所包含的所有内容,由于无需使用指针,对其进行存储时数据量可以进一步压缩。而在进行查询时,由于上述紧凑格式的数据能够完整表示出前缀树所包含的所有内容,可以直接用于匹配检索,因此,可以根据查询条件,在前缀树的内容对应的紧凑格式的数据中查找符合查询条件的字符串数据,获取字符串数据的标识信息。
在上述场景中,第二信息所表示的内容为每个节点是否为字符串数据的最后一个字符,由此通过第二信息可以哪些节点是字符串数据的最后一个字符,由此其父节点回溯即可确定该字符串数据的内容。因此,为字符串数据分配的标识信息可以与第二信息相关,例如可以依据字符串数据的最后一个字符在Terminals位图中出现的序号,来给字符串数据分配一个唯一的标识信息,通过这个标识信息,可以查出最后一个字符的对应的节点,然后通过层层向上一直到根节点即可恢复出此标识信息对应的字符串数据。以前述has、have、hot场景为例,has中最后一个字符s对应的s节点是Terminals位图中第一个出现(第一个1),则其标识信息是ID1,have中最后一个字符e对应的e节点是Terminals位图中第三个出现(第三个1),则其标识信息是ID3,同理可知,hot的标识信息是ID2。
在列式数据库的场景中,用户在查询数据时,用户的查询需求可能时基于行号查询某些行的字符串数据,也有可能是查询数据表中是否包含某些字符串数据,且这些字符串数据在数据表中的行号。由此,在存储字符串数据时,与标识信息建立关联关系的逻辑位置可以是字符串数据在数据表中的行号,即:将字符串数据对应的标识信息与字符串数据在数据表中的行号Row建立关联关系。
图3示出了一种适用于列式数据库的存储方案的原理示意图,将紧凑格式的前缀树数据直接存储到磁盘上,再加上每一行的行号与其数据对应的标识信息的关联关系的列表,从而来完成从行号与字符串数据的映射关系,这样可以支持字符串数据的快速读取和高效查找。由此,在列式数据库的查询场景中,在查询到字符串数据的标识信息之后,可以基于标识信息和行号的对应关系,确定本次查询的标识信息对应的字符串数据在数据表中的行号。在查询到结果之后,可以更新结果集,并向用户反馈查询结果。
在实际的数据存储场景中,一般数据都是切分成若干个DataPack(数据包),在本申请实施例的存储方案中,可以为每个DataPack中的字符串数据生成一个前缀树。当用户要查询某个字符串数据时,可以根据查询条件,依次在每个数据包对应的前缀树中查找符合查询条件的字符串数据,直至获取字符串数据的标识信息。例如,先在一个DataPack对应的前缀树中进行一次字符串数据查找,如果前缀树中不能找到这个字符串数据,可以跳过这整个DataPack,因为其中必然没有满足条件的数据记录。而如果前缀树中有这个字符串数据,就能得到它的标识信息,然后可以通过此标识信息,在关联关系列表中查找此标识信息所在的行号。
基于同一发明构思,本申请实施例中还提供了字符串数据的存储及查询设备,所述设备对应的方法是前述实施例中的方法,并且其解决问题的原理与该方法相似。
本申请实施例提供的一种字符串数据的存储设备包括数据构建装置和关联装置,在采用该设备存储字符串数据时,首先数据构建装置需要将字符串数据构建为前缀树。例如以三个字符串数据has、have、hot为例,为其构建的前缀树如图1所示,其根节点为super节点,该节点的内容为空,由于has、have、hot的第一个字符均为h,则第一层的子节点仅有h节点,has和have的第二个字符都会a,而hot的第二个字符为o,则第二层的子节点分别为a、o,依次类推第三层的子节点为s、v和t,第四层的节点仅有e。
由于前缀树的优点在于能够在查询时最大限度地减少无谓的字符串比较,查询效率较高,对于字符串数据来说,利用前缀树能共享共同前缀的特点,其查找效率会明显高于解压后逐条遍历的常规方式,在不引入索引的情况下,可以快速过滤不满足查询条件的数据包,大大降低了查询执行时间。
同时,当存储的字符串数据的数据量很大时,会有大量的字符串数据共享共同的前缀,由此表示这些字符串数据的节点数量会远小于所有字符串数据的总长度,因此在不使用LZ4等传统压缩算法的情况下也可以减少存储的数据量,而在查询时由于数据未进行过压缩,无需进行解压即可直接查找,也可以减少查询的执行时间。
但是,在使用前缀树存储字符串数据时会存在一个问题,即前缀树无法存储重复的字符串,当数据表中的第6个和第10个的字符串数据均为相同时,例如均为have,而前缀树中仅能够存储一个have。由此,本申请实施例中的存储设备在实现时,会通过数据构建装置为字符串数据分配对应的标识信息,使得通过该标识信息可以从前缀树中确定对应的字符串数据,并且由关联装置将字符串数据对应的标识信息与字符串数据在数据表中的逻辑位置建立关联关系。由此,本方案规避了前缀树无法存储重复的字符串带来的问题,即使数据表中有多个逻辑位置的字符串数据的内容相同,也能够正常实现存储和查询。
在本申请实施例中,逻辑位置是指某一数据在数据表中的位置信息,可以是该数据在数据表中的行号和/或列号等。例如为字符串数据have分配了一个标识信息ID3,通过该ID3能够在前缀树中快速查找到have,而数据表中的逻辑位置(数据表中的第6个和第10个)与该ID3建立有关联关系,因而用户在查询数据表中某一逻辑位置的数据时,可以先从该逻辑位置中读取标识信息,然后由标识信息在前缀树中找到对应的字符串数据。
在基于前述存储设备对字符串数据进行存储之后,本申请实施例还提供了一种字符串数据的查询设备,该设备包括请求获取装置和匹配查询装置。其中,请求获取装置用于获取查询请求,该查询请求包含字符串数据的查询条件。查询条件可以以数据库查询语句的形式,例如是SQL(Structured Query Language,结构化查询语言)语句“select*fromtable where string='abcd'”,表示查询数据表中abcd所在的逻辑位置。
在现有的方案中,需要将数据包解压之后,然后逐条其中的字符串数据。而在本实施例的方案中,采用了前缀树加上标识信息关联的方式,匹配查询装置可以根据查询条件,在前缀树中查找符合查询条件的字符串数据,获取字符串数据的标识信息,然后根据字符串数据存储时建立的关联关系,确定本次查询的标识信息对应的字符串数据在数据表中的逻辑位置。
由于字符串的匹配是比较费时的,而整型数据的匹配相对较为快速,为了进一步增加查询的速度,可以将字符串数据的标识信息的数据类型设定为整型数据,由此可以在匹配其与逻辑位置的关联关系时,提高处理的速度。
在实际场景中,若直接以前缀树的正常形式进行存储,由于每个节点都会需要存储节点对象的指针,而每个节点的指针都会需要一定的存储空间来进行存储,当字符串数据的数据量很大时,由于节点数也会相应增加,因此也会有一个较大的存储资源开支会用于指针数据的存储。为了减少这部分的存储资源,本申请实施例的方案中,数据构建装置会将前缀树的内容以紧凑格式的数据进行存储,该紧凑格式的数据无需使用指针,包括以下三部分内容:
1、前缀树中每个节点的字符。
仍以前述has、have、hot的字符串数据为例,可以在bases中保存这些节点的字符,由上至下由左至右依次为:super、h、a、o、s、v、t、e。
2、关于每个节点的子节点情况的第一信息。
例如以LOUDS(Level-order unary degree sequence)位图的形式来表示每个节点的子节点情况的第一信息时,可以是:101101101001000,每个0用于区分各个节点,0之前的1数量表示该子节点的数量。即super节点对应的内容为10,表示super节点有一个子节点h;h节点对应的内容为110,表示h节点有两个子节点a、o;a节点对应的内容为110,表示a节点有两个子节点s、v;o节点对应的内容为10,表示o节点有一个子节点t;s节点对应的内容为0,表示s节点没有子节点;v节点对应的内容为10,表示v节点有一个子节点e;t和e节点对应的内容为0,表示t和e节点没有子节点。
3、每个节点是否为字符串数据的最后一个字符的第二信息。
例如以Terminals位图的形式来表示每个节点是否为字符串数据的最后一个字符的第二信息,可以是:00001011。每个节点对应一个bit的数据,1表示该节点是字符串数据的最后一个字符,0表示该节点不是字符串数据的最后一个字符。由于字符串数据分别为has、have、hot,由此s、t和e节点对应的内容都是1,其余节点对应的内容均为0。
图2示出了紧凑格式的数据中三部分内容的对应关系,通过上述三部分内容可以完整表示出前缀树所包含的所有内容,由于无需使用指针,对其进行存储时数据量可以进一步压缩。而在进行查询时,由于上述紧凑格式的数据能够完整表示出前缀树所包含的所有内容,可以直接用于匹配检索,因此,匹配查询装置可以根据查询条件,在前缀树的内容对应的紧凑格式的数据中查找符合查询条件的字符串数据,获取字符串数据的标识信息。
在上述场景中,第二信息所表示的内容为每个节点是否为字符串数据的最后一个字符,由此通过第二信息可以哪些节点是字符串数据的最后一个字符,由此其父节点回溯即可确定该字符串数据的内容。因此,为字符串数据分配的标识信息可以与第二信息相关,例如可以依据字符串数据的最后一个字符在Terminals位图中出现的序号,来给字符串数据分配一个唯一的标识信息,通过这个标识信息,可以查出最后一个字符的对应的节点,然后通过层层向上一直到根节点即可恢复出此标识信息对应的字符串数据。以前述has、have、hot场景为例,has中最后一个字符s对应的s节点是Terminals位图中第一个出现(第一个1),则其标识信息是ID1,have中最后一个字符e对应的e节点是Terminals位图中第三个出现(第三个1),则其标识信息是ID3,同理可知,hot的标识信息是ID2。
在列式数据库的场景中,用户在查询数据时,用户的查询需求可能时基于行号查询某些行的字符串数据,也有可能是查询数据表中是否包含某些字符串数据,且这些字符串数据在数据表中的行号。由此,关联装置在存储字符串数据时,与标识信息建立关联关系的逻辑位置可以是字符串数据在数据表中的行号,即:关联装置将字符串数据对应的标识信息与字符串数据在数据表中的行号Row建立关联关系。
图3示出了一种适用于列式数据库的存储方案的原理示意图,将紧凑格式的前缀树数据直接存储到磁盘上,再加上每一行的行号与其数据对应的标识信息的关联关系的列表,从而来完成从行号与字符串数据的映射关系,这样可以支持字符串数据的快速读取和高效查找。由此,在列式数据库的查询场景中,匹配查询装置在查询到字符串数据的标识信息之后,可以基于标识信息和行号的对应关系,确定本次查询的标识信息对应的字符串数据在数据表中的行号。在查询到结果之后,可以更新结果集,并向用户反馈查询结果。
在实际的数据存储场景中,一般数据都是切分成若干个DataPack(数据包),在本申请实施例的存储方案中,可以为每个DataPack中的字符串数据生成一个前缀树。当用户要查询某个字符串数据时,匹配查询装置可以根据查询条件,依次在每个数据包对应的前缀树中查找符合查询条件的字符串数据,直至获取字符串数据的标识信息。例如,先在一个DataPack对应的前缀树中进行一次字符串数据查找,如果前缀树中不能找到这个字符串数据,可以跳过这整个DataPack,因为其中必然没有满足条件的数据记录。而如果前缀树中有这个字符串数据,就能得到它的标识信息,然后可以通过此标识信息,在关联关系列表中查找此标识信息所在的行号。
图4示出了本申请实施例提供的一种数据查询方案的示意图,该以列式数据库的场景为例,该方案使用了前缀树(Trie)存储列式数据库中的DataPack,并且使用了一种紧凑格式来实现前缀树的存储,这种紧凑格式能够用较小的空间表示前缀树。同时,赋予前缀树中保存的每一个字符串数据一个独一无二的标识信息,用字符串数据的最后一个字符在Terminals位图中的序号来表示。然后在前缀树之外,再加上一个关联关系列表,来完成从行号到字符串数据的映射关系。由此,在获取SQL查询语句之后,可以由此确定查询条件,然后加载DataPack。由于DataPack采用了前缀树表示,可以基于查询条件快速的过滤掉不包含目标字符串数据的DataPack,从而避免了读取并遍历所有DataPack中数据。
这样做有如下好处:
1、克服了前缀树无法存储重复键值的缺点,通过将若干行数据映射到同样的标识信息,可以实现重复字符串数据的存储与表示。
2、利用前缀树和关联关系列表,可以快速查询其中数据表中某几行的内容,先读关联关系列表找到行号对应的标识信息,然后再利用标识信息读取前缀树中此标识信息对应的字符串数据。
可以看出,以这样的数据存储、查询方案,一方面利用前缀树大大减少了数据占用的存储空间,而且通过直接存取前缀树,避免了读取时的解压操作,使得只要DataPack的数据读取上来之后,即可进行数据的直接查询。
为了验证本方案的可行性,在一个列式数据库的场景下,向一个数据表中插入了8000万条字符串记录,第一列都是形为“Store_xxxxxxxx”的字符串数据,其中“xxxxxxxx”为8位随机数字。然后统计了最终数据表的磁盘文件大小,结果显示无压缩的数据文件大小为1.1GB,采用现有技术中LZ4算法压缩的数据文件大小为670MB,而采用本方案前缀树+关联列表的方式的数据文件大小仅为420MB,数据的压缩率优于LZ4算法。
在查询性能上,对在这8000万条记录中查找某个特定记录所用的时间进行了测试,在现有技术方案中,由于要解压数据并逐条遍历和比较,总共耗时3.6秒,而本申请是实施例提供的方案中由于可以利用前缀树查找跳过大量记录,避免遍历比较,因此耗时仅有0.06秒,查询速度是现有方案的60倍。
综上所述,本申请提供的方案中,在存储字符串数据时,首先将字符串数据构建为前缀树,然后为所述字符串数据分配对应的标识信息,使得通过该标识信息可以从所述前缀树中确定对应的字符串数据,并且将所述字符串数据对应的标识信息与所述字符串数据在数据表中的逻辑位置建立关联关系。对于字符串数据来说利用前缀树能共享共同前缀的特点,在不使用LZ4等传统压缩算法的情况下直接减少存储的数据量,而在查询时由于数据未进行过压缩,无需进行解压即可直接查找,同时利用前缀树的查找功能,其查找效率会明显高于解压后逐条遍历的常规方式,在不引入索引的情况下,可以快速过滤不满足查询条件的数据包,大大降低了查询执行时间,并且由于建立了字符串数据逻辑位置与标识信息的关联关系,规避了前缀树无法存储重复的字符串带来的问题,即使数据表中有多个逻辑位置的字符串数据的内容相同,也能够正常实现存储和查询。
另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个如图5所示的设备,该设备包括存储有机器可读指令的一个或多个机器可读介质510和用于执行机器可读指令的处理器520,其中,当该机器可读指令被该处理器执行时,使得所述设备执行基于前述根据本申请的多个实施例的方法和/或技术方案。
需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
Claims (21)
1.一种字符串数据的存储方法,其中,该方法包括:
将字符串数据构建为前缀树;
为所述字符串数据分配对应的标识信息,所述标识信息用于从所述前缀树中确定对应的字符串数据;
将所述字符串数据对应的标识信息与所述字符串数据在数据表中的逻辑位置建立关联关系。
2.根据权利要求1所述的方法,其中,将字符串数据构建为前缀树之后,还包括:
将所述前缀树的内容以紧凑格式的数据进行存储,其中,所述紧凑格式的数据包括:前缀树中每个节点的字符、关于每个节点的子节点情况的第一信息以及每个节点是否为字符串数据的最后一个字符的第二信息。
3.根据权利要求2所述的方法,其中,为所述字符串数据分配的标识信息与所述第二信息相关。
4.根据权利要求1所述的方法,其中,将字符串数据构建为前缀树,包括:
为每个数据包的字符串数据生成一个前缀树。
5.根据权利要求1所述的方法,其中,所述字符串数据为列式数据库中的数据;
将所述字符串数据对应的标识信息与所述字符串数据在数据表中的逻辑位置建立关联关系,包括:
将所述字符串数据对应的标识信息与所述字符串数据在数据表中的行号建立关联关系。
6.一种字符串数据的查询方法,其中,该方法包括:
获取查询请求,所述查询请求包含字符串数据的查询条件;
根据所述查询条件,在前缀树中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息;
根据字符串数据存储时建立的关联关系,确定本次查询的标识信息对应的字符串数据在数据表中的逻辑位置。
7.根据权利要求6所述的方法,其中,根据所述查询条件,在前缀树中查找符合所述查询条件的字符串数据,包括:
根据所述查询条件,在前缀树的内容对应的紧凑格式的数据中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息,其中,所述紧凑格式的数据包括:前缀树中每个节点的字符、关于每个节点的子节点情况的第一信息以及每个节点是否为字符串数据的最后一个字符的第二信息。
8.根据权利要求7所述的方法,其中,所述字符串数据的标识信息与所述第二信息相关。
9.根据权利要求6所述的方法,其中,根据所述查询条件,在前缀树中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息,包括:
根据所述查询条件,依次在每个数据包对应的前缀树中查找符合所述查询条件的字符串数据,直至获取所述字符串数据的标识信息。
10.根据权利要求6所述的方法,其中,所述字符串数据为列式数据库中的数据;
确定本次查询的标识信息对应的字符串数据在数据表中的逻辑位置,包括:
确定本次查询的标识信息对应的字符串数据在数据表中的行号。
11.一种字符串数据的存储设备,其中,该存储设备包括:
数据构建装置,用于将字符串数据构建为前缀树,并为所述字符串数据分配对应的标识信息,所述标识信息用于从所述前缀树中确定对应的字符串数据;
关联装置,用于将所述字符串数据对应的标识信息与所述字符串数据在数据表中的逻辑位置建立关联关系。
12.根据权利要求11所述的存储设备,其中,所述数据构建装置,还用于在将字符串数据构建为前缀树之后,将所述前缀树的内容以紧凑格式的数据进行存储,其中,所述紧凑格式的数据包括:前缀树中每个节点的字符、关于每个节点的子节点情况的第一信息以及每个节点是否为字符串数据的最后一个字符的第二信息。
13.根据权利要求12所述的存储设备,其中,所述数据构建装置为所述字符串数据分配的标识信息与所述第二信息相关。
14.根据权利要求11所述的存储设备,其中,所述数据构建装置,用于为每个数据包的字符串数据生成一个前缀树。
15.根据权利要求11所述的存储设备,其中,所述字符串数据为列式数据库中的数据;
所述关联装置,用于将所述字符串数据对应的标识信息与所述字符串数据在数据表中的行号建立关联关系。
16.一种字符串数据的查询设备,其中,该查询设备包括:
请求获取装置,用于获取查询请求,所述查询请求包含字符串数据的查询条件;
匹配查询装置,用于根据所述查询条件,在前缀树中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息,并根据字符串数据存储时建立的关联关系,确定本次查询的标识信息对应的字符串数据在数据表中的逻辑位置。
17.根据权利要求16所述的查询设备,其中,所述匹配查询装置,用于根据所述查询条件,在前缀树的内容对应的紧凑格式的数据中查找符合所述查询条件的字符串数据,获取所述字符串数据的标识信息,其中,所述紧凑格式的数据包括:前缀树中每个节点的字符、关于每个节点的子节点情况的第一信息以及每个节点是否为字符串数据的最后一个字符的第二信息。
18.根据权利要求17所述的查询设备,其中,所述字符串数据的标识信息与所述第二信息相关。
19.根据权利要求16所述的查询设备,其中,每个前缀树对应一个数据包的字符串数据;
所述匹配查询装置,用于根据所述查询条件,依次在各个数据包对应的前缀树中查找符合所述查询条件的字符串数据,直至获取所述字符串数据的标识信息。
20.根据权利要求16所述的查询设备,其中,所述字符串数据为列式数据库中的数据;
所述匹配查询装置,用于确定本次查询的标识信息对应的字符串数据在数据表中的行号。
21.一种设备,其中,该设备包括:
处理器;以及
存储有机器可读指令的一个或多个机器可读介质,当所述处理器执行所述机器可读指令时,使得所述设备执行如权利要求1至10中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711482415.7A CN110020001A (zh) | 2017-12-29 | 2017-12-29 | 字符串数据的存储、查询方法以及相应的设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711482415.7A CN110020001A (zh) | 2017-12-29 | 2017-12-29 | 字符串数据的存储、查询方法以及相应的设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110020001A true CN110020001A (zh) | 2019-07-16 |
Family
ID=67187185
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711482415.7A Pending CN110020001A (zh) | 2017-12-29 | 2017-12-29 | 字符串数据的存储、查询方法以及相应的设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110020001A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111339382A (zh) * | 2020-03-11 | 2020-06-26 | 腾讯科技(深圳)有限公司 | 字符串数据检索方法、装置、计算机设备及存储介质 |
CN112732725A (zh) * | 2021-01-22 | 2021-04-30 | 上海交通大学 | 基于nvm混合内存的自适应前缀树构建方法及其系统、介质 |
CN112765443A (zh) * | 2020-12-31 | 2021-05-07 | 广州技象科技有限公司 | 基于历史操作数据的物联网数据查询方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102929900A (zh) * | 2012-01-16 | 2013-02-13 | 中国科学院北京基因组研究所 | 一种字符串匹配的方法及装置 |
CN105117417A (zh) * | 2015-07-30 | 2015-12-02 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
CN106970936A (zh) * | 2017-02-09 | 2017-07-21 | 阿里巴巴集团控股有限公司 | 数据处理方法及装置、数据查询方法及装置 |
-
2017
- 2017-12-29 CN CN201711482415.7A patent/CN110020001A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102929900A (zh) * | 2012-01-16 | 2013-02-13 | 中国科学院北京基因组研究所 | 一种字符串匹配的方法及装置 |
CN105117417A (zh) * | 2015-07-30 | 2015-12-02 | 西安交通大学 | 一种读优化的内存数据库Trie树索引方法 |
CN106970936A (zh) * | 2017-02-09 | 2017-07-21 | 阿里巴巴集团控股有限公司 | 数据处理方法及装置、数据查询方法及装置 |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111339382A (zh) * | 2020-03-11 | 2020-06-26 | 腾讯科技(深圳)有限公司 | 字符串数据检索方法、装置、计算机设备及存储介质 |
CN111339382B (zh) * | 2020-03-11 | 2023-09-22 | 腾讯科技(深圳)有限公司 | 字符串数据检索方法、装置、计算机设备及存储介质 |
CN112765443A (zh) * | 2020-12-31 | 2021-05-07 | 广州技象科技有限公司 | 基于历史操作数据的物联网数据查询方法及装置 |
CN112765443B (zh) * | 2020-12-31 | 2023-10-24 | 广州技象科技有限公司 | 基于历史操作数据的物联网数据查询方法及装置 |
CN112732725A (zh) * | 2021-01-22 | 2021-04-30 | 上海交通大学 | 基于nvm混合内存的自适应前缀树构建方法及其系统、介质 |
CN112732725B (zh) * | 2021-01-22 | 2022-03-25 | 上海交通大学 | 基于nvm混合内存的自适应前缀树构建方法及其系统、介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11899641B2 (en) | Trie-based indices for databases | |
US10558659B2 (en) | Techniques for dictionary based join and aggregation | |
CN104794123B (zh) | 一种为半结构化数据构建NoSQL数据库索引的方法及装置 | |
CN110413611B (zh) | 数据存储、查询方法及装置 | |
CN108205577B (zh) | 一种数组构建、数组查询的方法、装置及电子设备 | |
CN108509543B (zh) | 一种基于Spark Streaming的流式RDF数据多关键词并行搜索方法 | |
Stottler et al. | Rapid Retrieval Algorithms for Case-Based Reasoning. | |
US20150058352A1 (en) | Thin database indexing | |
CN106874425B (zh) | 基于Storm的实时关键词近似搜索算法 | |
CN110020001A (zh) | 字符串数据的存储、查询方法以及相应的设备 | |
US20110179013A1 (en) | Search Log Online Analytic Processing | |
CN112912870A (zh) | 租户标识符的转换 | |
JP2019520627A (ja) | データベース中にグラフ情報を記憶するためのb木使用 | |
CN111737537B (zh) | 基于图数据库的poi推荐方法、设备及介质 | |
GB2516501A (en) | Method and system for processing data in a parallel database environment | |
CN111125216B (zh) | 数据导入Phoenix的方法及装置 | |
CN113297171A (zh) | 数据库迁移方法及装置、数据库集群 | |
CN110389953B (zh) | 基于压缩图的数据存储方法、存储介质、存储装置和服务器 | |
US9292553B2 (en) | Queries for thin database indexing | |
CN111221814A (zh) | 二级索引的构建方法、装置及设备 | |
CN113821508B (zh) | 一种数组索引的实现方法和系统 | |
CN111309704B (zh) | 数据库操作方法和数据库操作系统 | |
Yang et al. | Querying a collection of continuous functions | |
US10380090B1 (en) | Nested object serialization and deserialization | |
US20170300516A1 (en) | System and method for building a dwarf data structure |
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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190716 |
|
RJ01 | Rejection of invention patent application after publication |