CN107577436B - 一种数据存储方法及装置 - Google Patents
一种数据存储方法及装置 Download PDFInfo
- Publication number
- CN107577436B CN107577436B CN201710842915.0A CN201710842915A CN107577436B CN 107577436 B CN107577436 B CN 107577436B CN 201710842915 A CN201710842915 A CN 201710842915A CN 107577436 B CN107577436 B CN 107577436B
- Authority
- CN
- China
- Prior art keywords
- data
- current
- partition
- query
- storage file
- 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
Links
- 238000013500 data storage Methods 0.000 title claims abstract description 66
- 238000000034 method Methods 0.000 title claims abstract description 58
- 238000005192 partition Methods 0.000 claims abstract description 190
- 230000000903 blocking effect Effects 0.000 claims description 6
- 230000000694 effects Effects 0.000 abstract description 2
- 238000007906 compression Methods 0.000 description 6
- 230000006835 compression Effects 0.000 description 6
- 230000006837 decompression Effects 0.000 description 5
- 238000010586 diagram Methods 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 238000013144 data compression Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据存储方法,在进行数据存储时,由于分区索引中只存储了表分区的指定分区段中的最大数据、最小数据,分块索引只存储了列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各已存数据之和及已存数据的平均值,所以分区索引和分块索引所占用的存储空间均非常小,即使在进行海量数据存储时,分区索引和分块索引也可以基本存储于内存中,避免了由于索引文件巨大而造成的内存频繁替换。因此,本数据存储方法,在进行海量数据存储时,能够将分区索引和分块索引完整的存储在内存中,提高数据的查询速度。此外,本发明还公开了一种数据存储装置,效果如上。
Description
技术领域
本发明涉及数据存储领域,特别涉及一种数据存储方法及装置。
背景技术
随着互联网的快速发展,数据量变得越来越大,尤其是一些如埋点日志和监控日志等的非核心数据变得非常庞大,如果继续使用传统的数据存储方式进行这些海量数据的存储,不仅会造成大量存储资源的浪费,还会使得数据的查询速度变得非常慢。
例如,目前使用较为广泛的压缩比较低的Mysql数据库,采用了占用内存空间较大的B+树索引。由于Mysql数据库的压缩比较低,如果当被存储数据的大小为a时,其存储该存储数据所占用的存储空间大小则近似为a,那么与该存储数据对应的B+树索引所占用的存储空间大小也近似为a。这相当于,Mysql数据库存储大小为a的数据,需要占用大小为2a的内存空间。因此,虽然Mysql数据库用于小量数据的存储时,尽管与小量数据对应的B+树索较大,可是由于数据量本身很小,所以仍然可以将与小数据量数据对应的完整的B+树索引全部存储于内存中,不会造成内存替换,使得数据的查询速度很快,但是,当Mysql数据库用于海量数据的存储时,由于与海量数据对应的B+树索引较大,所以无法将完整的B+树索全部存储于内存中,从而造成了内存替换,进而导致数据的查询速度变得很慢。
因此,如何在进行海量数据存储时,提高数据的查询速度是本领域技术人员目前需要解决的技术问题。
发明内容
本发明的目的是提供一种数据存储方法及装置,在进行海量数据存储时,能够提高数据的查询速度。
为了解决上述技术问题,本发明提供的一种数据存储方法,包括:
在当前数据写入之前,当无未存满分块时,在表分区中建立包含有列存储文件的分块;
将所述当前数据按列拆分,并将所述当前数据按列并发写入当前列存储文件;
在所述当前数据写入完毕后,在当前分块中建立与各所述当前列存储文件对应的分块索引,并在所述分块索引中记录所述当前列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各所述已存数据之和及所述已存数据的平均值;
在写入数据全部写入完毕后,在当前表分区中建立与所述当前表分区中的指定分区段对应的分区索引,并在所述分区索引中记录所述指定分区段中的最大数据和最小数据。
优选地,所述当无未存满分块时,在表分区中建立包含有列存储文件的分块具体包括:
当无未存满表分区时,新建当前表分区,并在所述当前表分区中建立包含有所述列存储文件的所述分块。
优选地,所述数据存储方法还包括:
在所述写入数据写入完毕之后,扫描当前存储目录下已写入的文件数据;
当扫描到已存满分块中的所述列存储文件存储有未压缩数据时,压缩所述未压缩数据。
优选地,所述数据存储方法还包括:
在所述当前数据写入完毕后,计算所述当前列存储文件中最大数据和最小数据的差值,并将所述差值均匀划分为N个范围段;
在所述当前分块中建立与各所述当前列存储文件对应的范围段索引,并在所述范围段索引中,标记所述当前列存储文件中数值型数据的分布情况;
其中,N为正整数。
优选地,所述数据存储方法还包括:
在所述当前数据写入完毕后,在所述当前分块中建立与各所述当前列存储文件对应的字符位索引,并在所述字符位索引中,标记所述当前列存储文件中字符型数据的分布情况。
优选地,所述数据存储方法还包括:
在所述当前数据写入完毕后,将与所述当前列存储文件对应的各索引加载至JAVA虚拟机内存;
当接收查询请求时,如果所述JAVA虚拟机内存中存储有与当前查询数据所在的所述列存储文件对应的所述索引,则依据所述JAVA虚拟机内存中存储的所述索引检索出所述当前查询数据。
优选地,所述数据存储方法还包括:
在获取查询数据之后,将所述查询数据所在的所述列存储文件中的所有解压数据存储至JAVA堆外内存;
当接收到查询请求时,如果所述JAVA堆外内存中存储有当前查询数据,则从所述JAVA堆外内存中获取所述当前查询数据。
优选地,所述将所述查询数据所在的所述列存储文件中的所有解压数据存储至JAVA堆外内存具体包括:
将所述解压数据以字节流形式存储至所述JAVA堆外内存;
则对应的,所述从所述JAVA堆外内存中获取所述当前查询数据具体包括:
以所述字节流形式在所述JAVA堆外内存中检索出所述当前查询数据;
将所述当前查询数据转化成字符串形式的当前查询数据,并获取将所述字符串形式的当前查询数据。
优选地,所述数据存储方法还包括:
在获取查询数据之后,将所述查询数据写入JAVA虚拟机内存,且如果所述JAVA虚拟机内存中存储的所述查询数据在预设时间内未使用,则清除所述JAVA虚拟机内存中存储的所述查询数据;
则对应的,当在预设时间内接收到获取所述查询数据的查询请求时,直接从所述JAVA堆外内存中获取所述查询数据。
为了解决上述技术问题,本发明还提供的一种数据存储装置,包括:
建立模块,用于在当前数据写入之前,当无未存满分块时,在表分区中建立包含有列存储文件的分块;
写入模块,用于将所述当前数据按列拆分,并将所述当前数据按列并发写入当前列存储文件;
创建分块索引模块,用于在所述当前数据写入完毕后,在当前分块中建立与各所述当前列存储文件对应的分块索引,并在所述分块索引中记录所述当前列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各所述已存数据之和及所述已存数据的平均值;
创建分区索引模块,用于在写入数据全部写入完毕后,在当前表分区中建立与所述当前表分区中的指定分区段对应的分区索引,并在所述分区索引中记录所述指定分区段中的最大数据和最小数据。
由此可见,本发明提供的数据存储方法,在进行数据存储时,由于分区索引中只存储了表分区的指定分区段中的最大数据、最小数据,分块索引只存储了列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各已存数据之和及已存数据的平均值,所以分区索引和分块索引所占用的存储空间均非常小,即使在进行海量数据存储时,索引文件也可以基本存储于内存中,避免了由于索引文件巨大而造成的内存频繁替换。因此,当用户进行数据查询时,可以直接利用内存中的分区索引快速定位到满足查询条件的表分区,在定位到表分区后,再利用存储于内存中的分块索引快速定位到满足查询条件的列存储文件,然后只在相关列存储文件中检索出满足查询条件的数据即可。所以,本发明提供的数据存储方法,在进行海量数据存储时,不仅能够通过将索引文件完整的存储在内存中,提高数据的查询速度,还可以通过只在相关列存储文件中检索查询数据,缩小数据的检索范围,进一步提高了数据的查询速度。此外,本发明还提供了一种数据存储装置,效果如上。
附图说明
为了更清楚地说明本发明实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
图1为本发明实施例提供的一种数据存储方法的流程图;
图2为本发明实施例提供的数据存储方法中表分区、分块、列存储文件及索引的对应关系的示意图;
图3为本发明实施例提供的另一种数据存储方法的流程图;
图4为本发明实施例提供的另一种数据存储方法的流程图;
图5为本发明实施例提供的另一种数据存储方法的流程图;
图6为本发明实施例提供的一种数据存储装置的结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有付出创造性劳动的前提下,所获得的所有其他实施例,都属于本发明保护范围。
本发明的目的是提供一种数据存储方法及装置,在进行海量数据存储时,能够提高数据的查询速度。
为了使本领域的技术人员更好的理解本发明技术方案,下面结合附图和具体实施方式对本发明作进一步的详细说明。
图1为本发明实施例提供的一种数据存储方法的流程图。如图1所示,数据存储方法包括:
S10:在当前数据写入之前,当无未存满分块时,在表分区中建立包含有列存储文件的分块。
S11:将当前数据按列拆分,并按列并发写入当前列存储文件。
S12:在当前数据写入完毕后,在当前分块中建立与各当前列存储文件对应的分块索引,并在分块索引中记录当前列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各已存数据之和及已存数据的平均值。
S13:在写入数据全部写入完毕后,在当前表分区中建立与当前表分区中的指定分区段对应的分区索引,并在分区索引中记录指定分区段中的最大数据和最小数据。
需要说明的是,本发明优先用于基本有序数据的存储。当前数据是指即将进行写入的固定数据量的数据,且固定数据量小于或等于一个列存储文件最多可存储数据的行数。如,当一个列存储文件中最多可以存储10万行数据,而写入数据量又大于10万行时,固定数据量为10万行;当一个列存储文件最多可以存储10万行数据,而写入数据量小于或等于10万行时,固定数据量与写入数据量相同。其中,写入数据量为所有写入数据的总数据量,且对于写入数据量大于固定数据量的情况而言,是将写入数据量分成多个固定数据量,以固定数据量的写入数据作为当前数据进行循环写入的。
图2为本发明实施例提供的数据存储方法中表分区、分块、列存储文件及索引的对应关系的示意图。如图2所示,分块是指包含列存储文件和与列存储文件对应的索引的块分区20,表分区为包含有固定个数的块分区20的分区2。
另外,需要说明的是,当前分块为写入当前数据的分块,当前分块中的列存储文件为当前列存储文件。
在具体实施中,对于步骤S10来说,在接收到写入数据的写入请求后,首先获取写入请求中携带的写入数据量的信息并确定写入数据量,然后判断存储空间中是否具有未存满的分块,如果有,则进入步骤S11,否则,在表分区中新建立一个包含有列存储文件的分块作为当前分块以在当前列存储文件中存储当前数据。而且,可以理解的是,存储空间中无未存满分块的情况有两种,第一种情况是:存储空间中无表分区,即存储空间中无分块,或存储空间中已有表分区,且已有表分区均已存满;第二种情况是:存储空间中已有表分区,虽然表分区未存满,但是表分区所有的分块均已存满。对于第一种情况来说,需要新建表分区作为当前表分区,然后再在当前表分区中建立分块;对于第二种情况来说,则无需再新建表分区,直接在现有的未存满表分区中新建分块即可。也就是说,在接收到写入请求后,在当前数据写入之前,会先确定出当前数据所属的表分区或分块,只有在无分块或分块已存满的情况下,才在表分区中新建包含有列存储文件的分块。其中,当前表分区指包含有当前分块的表分区。
为了在存储空间中没有表分区时,仍然可以将写入数据有序的存储起来,作为优选地实施方式,当无未存满分块时,在表分区中建立包含有列存储文件的分块具体包括:当无未存满表分区时,新建当前表分区,并在当前表分区中建立包含有列存储文件的分块。
对于步骤S11来说,当写入数据校验成功后,将当前数据按列拆分(即将每行当前数据按照数据类型分成不同的列,同一列包含同一种数据类型的数据)后,将当前数据按列并发的写入当前列存储文件中,在当前数据写入完成后,每一个列存储文件存储一种数据,如,当前数据按照时间、年龄和门牌号分成三列,则在存储时间的列存储文件中仅存储有时间数据,在存储年龄的列存储文件中仅存储有年龄数据,在存储门牌号的列存储文件中仅存储有门牌号,且同一行的数据相互对应。其中,对写入数据进行校验是指验证表是否存在、字段是否存在、列是否存在、数据类型是否符合及数据长度是否超长等。
如果一个列存储文件可以存储10万行数据,一个表分区最多可以包含有100个分块,一个分块中包含有各不相同且相互对应的列存储文件。在一个具体实施中,当前存储空间中没有表分区,则在接收到请求写入101万行数据的写入请求后,会将10万行写入数据作为当前数据,并且在当前数据写入之前,会预先新建1个表分区作为当前表分区,并在当前表分区中建立一个分块作为当前分块,然后将当前数据按列并发写入当前分块中的当前列存储文件中,在当前数据写入完毕后,会继续在当前表分区中建立新的分块作为当前分块,然后再将10万行未写入数据按列并发写入新建的当前分块中的当前列存储文件中,依次类推,直至将10万行写入数据分别写入10个分块中,剩余1万行数据未写入存储空间,这时仍然是在当前表分区中新建一个分块,将剩余的1万行未写入数据作为当前数据按列并发写入该分块中的列存储文件中,最终将写入数据全部写入存储空间,完成数据存储。
在另一个实施例中,当前已经有1个包含有11个分块的表分区,且第11个分块中仅存储了1万行数据,那么当接收到写入206万行数据的写入请求时,则会先将9万行的写入数据作为当前数据按列并发写入第11个分块中的当前列存储文件中,在当前数据写入完毕后,则会继续在当前表分区中新建一个分块作为当前分块,将10万行未写入的写入数据作为当前数据按列并发写入新建的当前分块中的当前列存储文件中,依次类推,直至将199万行写入数据分别写入20个分块中,剩余7万行写入数据未写入存储空间时,仍然是在当前表分区中新建一个分块,将剩余的7万行未写入数据作为当前数据按列并发写入该分块中的列存储文件中,最终将写入数据全部写入存储空间,完成数据存储。
在另一个实施例中,当前存储空间中已经有一个包含有31个分块的表分区,且第31个分块中只存储了7万行数据,那么当接收到写入900万行数据的写入请求时,则会将3万行的写入数据作为当前数据按列并发写入第31个分块中的列存储文件中,在当前数据写入完毕后,则会继续在当前表分区中新建一个分块作为当前分块,将10万行未写入的写入数据作为当前数据按列并发写入新建的当前分块中的当前列存储文件中,依次类推,直至将693万行写入数据分别写入70个分块中,当前表分区已经写满,剩余207万行写入数据未写入存储空间时,需要新建立一个表分区作为当前表分区,并在新建的当前表分区中建立一个分块作为当前分块,将剩余207万行数据中的10万行数据作为当前数据按列并发写入新建的当前分块中的当前列存储文件中,然后再在当前表分区中建立一个分块作为当前分块,将剩余的197万行数据中的10万行数据作为当前数据按列并发写入新建的当前分块中的当前列存储文件中,依次类推,直至将200万行写入数据分别写入20个分块中,剩余7万行数据未写入存储空间,这时仍然是在当前表分区中新建一个分块,将剩余的7万行未写入数据作为当前数据按列并发写入该分块中的列存储文件中,最终将写入数据全部写入存储空间,完成数据存储。
当然,可以理解的是,当接收到其它写入请求时,按照上述三个具体实施例的规律,在当前数据写入之前,当无未存满分块时,在表分区中建立包含有列存储文件的分块。
另外,需要说明的是,步骤S13中提到的指定分区段必须为存储着基本有序数据的数据列。
对于步骤S12来说,在当前数据写完之后,意味着当前分块已经写满或写入数据已经全部写入存储空间,则为了在接收到查询请求后,快速的检索到查询数据,会随即建立与当前分块中的各当前列存储文件对应的分块索引,即每一个列存储文件均有一个分块索引与之对应,并在分块索引中记录与之对应的列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各已存数据之和及已存数据的平均值,所以在确定查询数据在哪一个表分区之后,便可以通过判断查询数据是否既小于分块索引中记录的最大值,又大于分块索引中记录的最小值,和依据分块索引中的记录的其它信息判断与之对应的列存储文件中的数据是否满足其它查询条件,确定查询数据是否可能在该分块索引对应的列存储文件中,从而实现了依据分块索引快速定位到查询数据所在的列存储文件,以在该列存储文件中检索出查询数据,缩小查询范围,提升数据的查询速度,其中,查询数据是指用符合查询条件的数据。
同理,对于步骤S13来说,在写入数据全部写入完毕后,为了在接收到查询请求后,快速的检索到查询数据,会随即建立与表分区中的指定分区段对应的分区索引,并由于指定分区段对应为存储着基本有序数据的数据列,所以,只需要在分区索引中记录与之对应的表分区的指定分区段中的最大数据和最小数据,便可以反应指定分区段中的存储的数据大致有哪些,所以通过判断查询数据是否既小于分区索引中记录最大数据,又大于分区索引中记录的最小数据,确定查询数据是否可能在该分区索引对应的表分区中,从而能够在接收到查询请求后,依据分区索引快速定位到查询数据所在的表分区,在对应表分区中检索查询数据,缩小查询范围,提升数据的查询速度。其中,最大数据和最小数据均指数值型数据,当然,可以理解的是,已存数据之和及已存数据的平均值也均指数值型数据的和及平均值。
另外,值得注意的是,当列存储文件中的数据更新时,与列存储文件对应的分区索引和分块索引均会随之实时更新。
由此可见,本实施例提供的数据存储方法,在进行数据存储时,由于分区索引中只存储了表分区的指定分区段中的最大数据、最小数据,分块索引只存储了列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各已存数据之和及已存数据的平均值,所以分区索引和分块索引所占用的存储空间均非常小,即使在进行海量数据存储时,索引文件也可以基本存储于内存中,避免了由于索引文件巨大而造成的内存频繁替换。因此,当用户进行数据查询时,可以直接利用内存中的分区索引快速定位到满足查询条件的表分区,在定位到表分区后,再利用存储于内存中的分块索引快速定位到满足查询条件的列存储文件,然后只在相关列存储文件中检索出满足查询条件的数据即可。所以,本实施例提供的数据存储方法,在进行海量数据存储时,不仅能够通过将索引文件完整的存储在内存中,提高数据的查询速度,还可以通过只在相关列存储文件中检索查询数据,缩小数据的检索范围,进一步提高了数据的查询速度。
在具体实施中,如果在数据写入列存储文件的过程中,对列存储文件中的数据进行同步的压缩操作,不仅会降低数据的写入速度,还很可能会引起CPU峰值,尤其是在写入数据的并发度较高的时候,往往会导致CPU飙升,从而降低数据的查询速度。因此,为了节省存储空间、提升数据的写入速度和查询速度,本实施例在上述实施例的基础上作进一步改进,可以对写满的列存储文件中的数据进行异步压缩。
图3为本发明实施例提供的另一种数据存储方法的流程图。如图3所示,作为优选地实施方式,在图1的基础上,执行完步骤S13后,还包括:
S30:在写入数据写入完毕之后,扫描当前存储目录下已写入的文件数据。
S31:当扫描到已存满分块中的列存储文件存储有未压缩数据时,压缩未压缩数据。
需要说明的是,对于步骤S30来说,可以利用守护线程通过扫描当前存储目录下的文件夹,对文件夹的最后修改时间做过滤,当前扫描到的文件夹的最后修改时间小于预设时间(如1天)时,则继续扫描该文件夹内部的已存满分块中的列存储文件的压缩标识。对于步骤S31来说,如果扫描到已存满分块中的列存储文件的压缩标识为未压缩标识时,则对该列存储文件中存储的未压缩数据进行压缩,并且在数据压缩完成后,修改该列存储文件的压缩标识为已压缩标识,删除该列存储文件中存储的未压缩数据。其中,预设时间是依据实际需要预先设置的。
而且,值得注意的是,当进行数据查询时,如果只需要获取某一种数据,则只需要对某一列存储文件进行解压缩即可,而无需对所有的列存储文件均进行解压缩操作,能够进一步提升数据查询的速度。
由此可见,本实施例提供的数据存储方法,通过采用异步压缩,不仅可以在不影响数据写入的前提下,节省存储空间,而且,还不会引起CPU峰值而导致数据的查询速度变慢,所以,本数据存储方法能够提升数据的查询速度。
在具体实施中,为了提升数据的查询速度,除了通过分区索引将检索范围定位到表分区,再通过分块索引将检索范围缩小到存储文件外,还可以建立更加细致的索引,将检索范围缩到更小。因此,本实施例在上述实施例的基础上作进一步改进,通过建立与列存储文件对应的范围段索引,用于标记与之对应的列存储文件中包含有哪些范围段的数据,当用户进行数据查询时,则可以通过范围段索引锁定查询数据所在的列存储文件。如,一个列存储文件中存储的最小数据为0,最大数据为749,但是并没有存储400这个数据,则当用户查询数据400时,如果依据分块索引检索查询数据的话,则会认为列存储文件中可能具有400这个数据,并对整个列存储文件中存储的所有数据进行检索,但是最终却不会检索到400这个数据。而如果建立了范围段索引,则可以在范围段索引中标记列存储文件中是否具有哪一范围段的数据,如在范围段索引中,标记了列存储文件中没有250-499范围段的数据,那么当用户查询数据时,虽然查询数据400介于列存储文件中存储的最大数据和最小数据之间,但是由于在范围段索引中标记了该列存储文件中没有250-499范围段的数据,则认为该列存储文件中没有400这个数据,不需要对该列存储文件中的所有数据进行检索操作,而直接检索其它范围段索引中将250-499范围段标记为1的列存储文件中存储的数据即可,从而缩小了数据的检索范围,能够进一步提升数据的查询速度。
图4为本发明实施例提供的另一种数据存储方法的流程图。如图4所示,作为优选地实施方式,在图1的基础上,还包括:
S40:在当前数据写入完毕后,计算当前列存储文件中的最大数据和最小数据的差值,并将差值均匀划分为N个范围段。
S41:在当前分块中建立与各当前列存储文件对应的范围段索引,并在范围段索引中,标记当前列存储文件中数值型数据的分布情况。
需要说明的是,本实施例中将步骤S40安排在执行完步骤S11后执行,将步骤S41安排在执行完步骤S12后执行,但在具体实施中,步骤S40可以在执行完步骤S11后的任一步骤执行之前或之后执行,而步骤S41只要是在步骤S40后执行均可。数值型数据的分布情况是指列存储文件中的数据均分布在哪些范围段中。而且,当列存储文件中的数据更新时,与列存储文件对应的范围段索引也随之实时更新。
另外,步骤S40中提到的N为正整数,且当希望范围段索引越细致时,则可以将N设置的越大,但同时,N越大,范围段索引所占用的存储空间也就越大,所以N的值,可以依据实际需要进行预先设置。一般地,当一个表分区包含100个分块,且分块中的列存储文件可以存储10万行数据时,可以将N设置为1024,也就是说,使列存储文件中存储的数据间的最大差值均匀的划分为1024个范围段,那么标记了列存储文件中是否有这1024个范围段数据的范围段索引所占用的存储空间仅仅约为存储文件中的所有数据所占用的存储空间的百分之一。
在具体实施中,对于步骤S41来说,可以用1标记列存储文件中具有范围段内的数据,用0标记列存储文件中没有范围段内的数据,如将0-249范围段标记为1,表明列存储文件中包含有0-249的数据,将250-499范围段标记为0,表明列存储文件中不包含250-499的数据,将500-749的范围段标记为1,表明列存储文件中包含有500-749的数据,以此类推,用0和1标记列存储文件中是否具有不同范围段的数据。
由此可见,本实施例提供的数据存储方法,可以通过占用存储空间非常小的范围段索引进一步缩小数据查询时,数据的检索范围,提升数据的查询速度。
在具体实施中,也许在存储数值型数据的同时,也会存储字符串数据,为了使本发明提供的数据存储方法,同样适用于字符串数据的存储,本实施例在上述实施例的基础上作进一步改进,通过建立的与列存储文件对应的字符位索引,将存储于列存储文件中的字符串数据中的某个字符在什么位置标记出来,使得当用户在查询字符串数据时,通过字符位索引快速定位查询的字符串数据所在的列存储文件。
图5为本发明实施例提供的另一种数据存储方法的流程图。如图5所示,作为优选地实施方式,在图4的基础上,还包括:
S50:在当前数据写入完毕后,在当前分块中建立与各当前列存储文件对应的字符位索引,并在字符位索引中,标记当前列存储文件中字符型数据的分布情况。
需要说明的是,本实施例中将步骤S50安排在执行完步骤S41后执行,但在具体实施中,只要步骤S50可以是在执行完步骤S11后的任一步骤执行之前或之后执行。字符型数据的分布情况是指存储于列存储文件中的字符串数据中的某个字符在什么位置,而且,当列存储文件中的数据更新时,与列存储文件对应的字符位索引也随之实时更新。
在具体实施中,对于步骤S50来说,可以用0和1来标记列存储文件中存储的数据中的某个字符是否在某个位置。例如,字符A可能出现的位置为64个,则对64个位置从1开始编号,一直编至64,即第M(1≤M≤64)个位置的编号为M,,然后将有A出现的位置标记为1,没有A出现的位置标记为0,同理,其它字符的标记规则与字符A的标记规则雷同,而且,基于该字符标记规则的字符位索引所占的存储空间仅为列存储文件中的数据所占用的存储空间的百分之一。具体地,当用户需要查询字符串ABC时,则先判定A在1的位置上是否出现过,B在2的位置上是否出现过,C在3的位置上是否出现过,也就是说,只要判断检索数据的1位置上,字符A对应的标记是否为0、2位置上,字符B对应的标记是否为0和3位置上,字符C对应的标记是否为0即可,而且只要其中的一个标记为0,则判定当前检索的列存储文件中的数据没有ABC,如此,仅通过字符位索引则可以确定查询数据是否存在于当前检索的列存储文件中,而无需对所有列存储文件中的全部数据进行检索以确定当前列存储文件中是否具有查询数据,进一步缩小了数据的检索范围,提升了数据的查询速度。
由此可见,本实施例提供的数据存储方法,可以通过占用存储空间非常小的字符位索引进一步缩小数据查询时,数据的检索范围,提升数据的查询速度。
而且,在具体实施中,当用户的查询条件为多个时,可以先利用分区索引确定出自身存储的部分数据满足第一个查询条件的表分区,然后再利用分块索引、范围段索引和字符位索引继续检索确定出该表分区中,自身存储的所有数据均满足第一个查询条件的第一强相关列存储文件,和自身存储的部分数据满足第一个查询条件的第一相关列存储文件,然后可以继续利用分块索引、范围段索引和字符位索引继续检索确定出第一强相关列存储文件或第一相关列存储文件中,自身存储的所有数据均同样满足第二个查询条件的第二强相关列存储文件,和自身存储的部分数据满足第二个查询条件的第二相关列存储文件,以此类推。那么,当仅仅是查询满足查询条件的查询数据的个数时,则只需要对相关列存储文件中存储的数据进行解压检索即可,而对于强相关列存储文件中存储的数据,则无需进行解压检索,仅根据与该强相关列存储文件对应的索引便可以确定满足查询条件的查询数据的个数,从而避免了不必要的解压检索,缩小了检索范围,提升了数据的查询速度。而且,就算是查询满足查询条件的查询数据,往往也仅仅是获取一定个数的查询数据,也并不需要对每一个列存储文件均进行解压检索,如果强相关列存储文件中存储的数据中包含的查询数据已经满足查询需求,则同样可以避免对相关列存储文件中存储的数据的进行解压检索,进一步地缩小了数据的检索范围,提升了数据的检索速度。
为了进一步提升数据的查询速度,可以将列存储文件中更新的数据对应的索引直接加载至JAVA虚拟机内存,当需要对更新的数据进行查询时,则无需再从内存中调用与更新的数据所在的列存储文件对应的索引,从而能够进一步提升数据的查询速度。作为优选地实施方式,上述实施例提供的数据存储方法还包括:在当前数据写入完毕后,将与当前列存储文件对应的各索引加载至JAVA虚拟机内存;当接收查询请求时,如果JAVA虚拟机内存中存储有与当前查询数据所在的列存储文件对应的索引,则依据JAVA虚拟机内存中存储的索引检索出当前查询数据。而如果JAVA虚拟机内存中没有存储与当前查询数据所在的列存储文件对应的索引,则依据内存中存储的索引检索出当前查询数据。具体地,每一个存列储文件中的数据更新时,均可以将与更新数据所在的列存储文件对应的索引加载至JAVA虚拟机内存,且JAVA虚拟机内存中可加载的索引量可以通过配置文件更改。此外,当JAVA虚拟机内存中加载的索引量达到最大值时,还可以通过近期最少使用算法(LRU算法)进行替换。
为了进一步提升数据的查询速度,可以将近期查询的列存储文件中存储的数据存储至JAVA堆外内存中,使得当用户再次获取近期查询过的列存储文件中存储的数据时,直接从JAVA堆外内存获取已经解压过的数据即可,而无需再从硬件存储设备或内存中调取该列存储文件,并对该列存储文件中的未解压数据进行解压操作以获取查询数据,从而节约了数据查询的时间,提升了数据的查询速度。作为优选地实施方式,上述实施例提供的数据存储方法还包括:在获取查询数据之后,将查询数据所在的列存储文件中的所有解压数据存储至JAVA堆外内存;当接收到查询请求时,如果JAVA堆外内存中存储有当前查询数据,则从JAVA堆外内存中获取当前查询数据。如果JAVA堆外内存中没有存储当前查询数据,则从硬件存储设备或内存中获取该列存储文件,并对该列存储文件中的未解压数据进行解压操作,以获取当前查询数据。JAVA堆外内存中可存储的数据量也可以通过配置文件进行修改,而且,当JAVA堆外内存中存储的数据量达到最大值时,可以通过LRU算法进行替换。另外,值得注意的是,可以依据JAVA堆外内存的总量和已使用的量来动态调整JAVA堆外内存中缓存数据的最大数据量,如,每隔十秒对JAVA堆外内存的使用情况进行一次检测,当JAVA堆外内存的使用量大于百分之八十时,则将最大数据量减少百分之十;当JAVA堆外内存的已使用量小于百分之七十时,则将最大数据量增加百分之十。
在具体实施中,由于JAVA中的字符串采用unicode编码存放,而unicode编码又使用3到4个字节标识一个字符,所以,如果使用JAVA中的字符串方式将存储文件中的解压数据存储在JAVA堆外内存中,将浪费非常多的存储空间。为此,作为优选地实施方式,上述将查询数据所在的列存储文件中的所有解压数据存储至JAVA堆外内存具体包括:将解压数据以字节流形式存储至JAVA堆外内存。则对应的,从JAVA堆外内存中获取当前查询数据具体包括:以字节流形式在JAVA堆外内存中检索出当前查询数据;将当前查询数据转化成字符串形式的当前查询数据,并获取将字符串形式的当前查询数据。
为了进一步提升数据的查询速度,可以将近期的查询数据存储到JAVA虚拟机内存中,同样的,JAVA虚拟机内存中可存储的查询数据的数据量可以通过配置文件进行修改,而且,当虚拟内存中存储的查询数据的数据量达到最大数据量时,可以通过LRU算法进行替换。另外,值得注意的是,当存储于JAVA虚拟机内存中的查询数据在一定时间内没有被再次使用时,则将该查询数据清除出JAVA虚拟机内存。具体地,作为优选地实施方式,上述数据存储的方法还包括:将每次的查询数据写入JAVA虚拟机内存,并且,如果JAVA虚拟机内存中存储的查询数据在预设时间内未使用,则清除JAVA虚拟机内存中存储的查询数据。
上文对于本发明提供的一种数据存储方法的实施例进行了详细的描述,本发明还提供了一种与该方法对应的数据存储装置,由于装置部分的实施例与方法部分的实施例相互照应,因此装置部分的实施例请参见方法部分的实施例的描述,这里暂不赘述。
图6为本发明实施例提供的一种数据存储装置的结构图。如图5所示,数据存储装置包括:
建立模块60,用于在当前数据写入之前,当无未存满分块时,在表分区中建立包含有列存储文件的分块;
写入模块61,用于将当前数据按列拆分,并将当前数据按列并发写入当前列存储文件;
创建分块索引模块62,用于在当前数据写入完毕后,在当前分块中建立与各当前列存储文件对应的分块索引,并在分块索引中记录当前列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各已存数据之和及已存数据的平均值;
创建分区索引模块63,用于在写入数据全部写入完毕后,在当前表分区中建立与当前表分区中的指定分区段对应的分区索引,并在分区索引中记录指定分区段中的最大数据和最小数据。
由此可见,本实施例提供的数据存储装置,在进行数据存储时,由于分区索引中只存储了表分区的指定分区段中的最大数据、最小数据,分块索引只存储了列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各已存数据之和及已存数据的平均值,所以分区索引和分块索引所占用的存储空间均非常小,即使在进行海量数据存储时,索引文件也可以基本存储于内存中,避免了由于索引文件巨大而造成的内存频繁替换。因此,当用户进行数据查询时,可以直接利用内存中的分区索引快速定位到满足查询条件的表分区,在定位到表分区后,再利用存储于内存中的分块索引快速定位到满足查询条件的列存储文件,然后只在相关列存储文件中检索出满足查询条件的数据即可。所以,本实施例提供的数据存储装置,在进行海量数据存储时,不仅能够通过将索引文件完整的存储在内存中,提高数据的查询速度,还可以通过只在相关列存储文件中查询检索数据,缩小数据的检索范围,进一步提高了数据的查询速度。
以上对本发明所提供的数据存储方法及装置进行了详细介绍。说明书中各个实施例采用递进的方式描述,每个实施例重点说明都是与其它实施例的不同之处,各个实施例之间相同相似部分互相参见即可。
应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
还需要说明的是,在本说明书中,诸如第一和第二之类的关系术语仅仅用来将一个实体或者操作与另一个实体或者操作区分开来,而不一定要求或者暗示这些实体或者操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何变体意在涵盖非排他性的包含,从而使得包括一系列的要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其它要素,或者还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
Claims (9)
1.一种数据存储方法,其特征在于,包括:
在当前数据写入之前,当无未存满分块时,在表分区中建立包含有列存储文件的分块;
将所述当前数据按列拆分,并将所述当前数据按列并发写入当前列存储文件;
在所述当前数据写入完毕后,在当前分块中建立与各所述当前列存储文件对应的分块索引,并在所述分块索引中记录所述当前列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各所述已存数据之和及所述已存数据的平均值;
在写入数据全部写入完毕后,在当前表分区中建立与所述当前表分区中的指定分区段对应的分区索引,并在所述分区索引中记录所述指定分区段中的最大数据和最小数据;
在所述当前数据写入完毕后,计算所述当前列存储文件中最大数据和最小数据的差值,并将所述差值均匀划分为N个范围段;
在所述当前分块中建立与各所述当前列存储文件对应的范围段索引,并在所述范围段索引中,标记所述当前列存储文件中数值型数据的分布情况;
其中,N为正整数。
2.根据权利要求1所述的数据存储方法,其特征在于,所述当无未存满分块时,在表分区中建立包含有列存储文件的分块具体包括:
当无未存满表分区时,新建当前表分区,并在所述当前表分区中建立包含有所述列存储文件的所述分块。
3.根据权利要求1所述的数据存储方法,其特征在于,还包括:
在所述写入数据写入完毕之后,扫描当前存储目录下已写入的文件数据;
当扫描到已存满分块中的所述列存储文件存储有未压缩数据时,压缩所述未压缩数据。
4.根据权利要求1所述的数据存储方法,其特征在于,还包括:
在所述当前数据写入完毕后,在所述当前分块中建立与各所述当前列存储文件对应的字符位索引,并在所述字符位索引中,标记所述当前列存储文件中字符型数据的分布情况。
5.根据权利要求1所述的数据存储方法,其特征在于,还包括:
在所述当前数据写入完毕后,将与所述当前列存储文件对应的各索引加载至JAVA虚拟机内存;
当接收查询请求时,如果所述JAVA虚拟机内存中存储有与当前查询数据所在的所述列存储文件对应的所述索引,则依据所述JAVA虚拟机内存中存储的所述索引检索出所述当前查询数据。
6.根据权利要求5所述的数据存储方法,其特征在于,还包括:
在获取所述当前查询数据之后,将所述当前查询数据所在的所述列存储文件中的所有解压数据存储至JAVA堆外内存;
当接收到新查询请求时,如果所述JAVA堆外内存中存储有所述新查询请求对应的当前查询数据,则从所述JAVA堆外内存中获取所述新查询请求对应的当前查询数据。
7.根据权利要求6所述的数据存储方法,其特征在于,所述将所述查询数据所在的所述列存储文件中的所有解压数据存储至JAVA堆外内存具体包括:
将所述解压数据以字节流形式存储至所述JAVA堆外内存;
则对应的,所述从所述JAVA堆外内存中获取所述当前查询数据具体包括:
以所述字节流形式在所述JAVA堆外内存中检索出所述当前查询数据;
将所述当前查询数据转化成字符串形式的当前查询数据,并获取将所述字符串形式的当前查询数据。
8.根据权利要求5所述的数据存储方法,其特征在于,还包括:
在获取所述当前查询数据之后,将所述当前查询数据写入JAVA虚拟机内存,且如果所述JAVA虚拟机内存中存储的所述当前查询数据在预设时间内未使用,则清除所述JAVA虚拟机内存中存储的所述当前查询数据;
则对应的,当在预设时间内接收到获取所述当前查询数据的查询请求时,直接从所述JAVA虚拟机内存中获取所述当前查询数据。
9.一种数据存储装置,其特征在于,包括:
建立模块,用于在当前数据写入之前,当无未存满分块时,在表分区中建立包含有列存储文件的分块;
写入模块,用于将所述当前数据按列拆分,并将所述当前数据按列并发写入当前列存储文件;
创建分块索引模块,用于在所述当前数据写入完毕后,在当前分块中建立与各所述当前列存储文件对应的分块索引,并在所述分块索引中记录所述当前列存储文件中的最大数据、最小数据、已存数据总量、空数据总量、各所述已存数据之和及所述已存数据的平均值;
创建分区索引模块,用于在写入数据全部写入完毕后,在当前表分区中建立与所述当前表分区中的指定分区段对应的分区索引,并在所述分区索引中记录所述指定分区段中的最大数据和最小数据;
所述数据存储装置,还用于:
在所述当前数据写入完毕后,计算所述当前列存储文件中最大数据和最小数据的差值,并将所述差值均匀划分为N个范围段;
在所述当前分块中建立与各所述当前列存储文件对应的范围段索引,并在所述范围段索引中,标记所述当前列存储文件中数值型数据的分布情况;
其中,N为正整数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710842915.0A CN107577436B (zh) | 2017-09-18 | 2017-09-18 | 一种数据存储方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710842915.0A CN107577436B (zh) | 2017-09-18 | 2017-09-18 | 一种数据存储方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107577436A CN107577436A (zh) | 2018-01-12 |
CN107577436B true CN107577436B (zh) | 2020-07-07 |
Family
ID=61036045
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710842915.0A Active CN107577436B (zh) | 2017-09-18 | 2017-09-18 | 一种数据存储方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107577436B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108256064B (zh) * | 2018-01-16 | 2019-09-17 | 北京三快在线科技有限公司 | 一种数据搜索方法和装置 |
CN109325031B (zh) * | 2018-09-13 | 2021-08-03 | 上海达梦数据库有限公司 | 一种数据统计方法、装置、设备和存储介质 |
CN110755063B (zh) * | 2018-10-06 | 2023-06-02 | 江苏创越医疗科技有限公司 | 低延迟的心电图绘制方法 |
CN109815241B (zh) * | 2019-01-31 | 2021-05-11 | 上海达梦数据库有限公司 | 数据查询方法、装置、设备和存储介质 |
CN110442576A (zh) * | 2019-07-02 | 2019-11-12 | 北京奇艺世纪科技有限公司 | 数据查询方法、装置、服务器和计算机可读介质 |
CN110555037B (zh) * | 2019-09-12 | 2020-10-23 | 苏州新希望科技有限公司 | 智慧城市数据共享系统 |
CN110704433B (zh) * | 2019-09-23 | 2023-03-28 | 北京优炫软件股份有限公司 | 列式存储数据的brin索引构建方法、数据检索方法及装置 |
CN111400346A (zh) * | 2020-03-13 | 2020-07-10 | 苏州浪潮智能科技有限公司 | 一种提升数据库一体机执行效率的方法、设备、装置和介质 |
CN113722623B (zh) * | 2021-09-03 | 2024-07-05 | 锐掣(杭州)科技有限公司 | 数据处理方法、装置、电子设备及存储介质 |
CN117234436B (zh) * | 2023-11-14 | 2024-02-20 | 苏州元脑智能科技有限公司 | 一种磁盘阵列的扩容方法、装置、存储系统及产品 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104376119A (zh) * | 2014-12-03 | 2015-02-25 | 天津南大通用数据技术股份有限公司 | 一种适应超大规模列存数据库的数据访问方法及装置 |
CN104834650A (zh) * | 2014-02-12 | 2015-08-12 | 清华大学 | 一种有效查询任务生成方法及系统 |
CN105408857A (zh) * | 2013-07-29 | 2016-03-16 | 亚马逊科技公司 | 通过针对选择性交织数据位生成用于关系数据库的多列索引 |
CN106844541A (zh) * | 2016-12-30 | 2017-06-13 | 晶赞广告(上海)有限公司 | 一种联机分析处理方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9195657B2 (en) * | 2010-03-08 | 2015-11-24 | Microsoft Technology Licensing, Llc | Columnar storage of a database index |
US9390115B2 (en) * | 2013-10-11 | 2016-07-12 | Oracle International Corporation | Tables with unlimited number of sparse columns and techniques for an efficient implementation |
-
2017
- 2017-09-18 CN CN201710842915.0A patent/CN107577436B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105408857A (zh) * | 2013-07-29 | 2016-03-16 | 亚马逊科技公司 | 通过针对选择性交织数据位生成用于关系数据库的多列索引 |
CN104834650A (zh) * | 2014-02-12 | 2015-08-12 | 清华大学 | 一种有效查询任务生成方法及系统 |
CN104376119A (zh) * | 2014-12-03 | 2015-02-25 | 天津南大通用数据技术股份有限公司 | 一种适应超大规模列存数据库的数据访问方法及装置 |
CN106844541A (zh) * | 2016-12-30 | 2017-06-13 | 晶赞广告(上海)有限公司 | 一种联机分析处理方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107577436A (zh) | 2018-01-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107577436B (zh) | 一种数据存储方法及装置 | |
US11238098B2 (en) | Heterogenous key-value sets in tree database | |
Ren et al. | SlimDB: A space-efficient key-value storage engine for semi-sorted data | |
US9262458B2 (en) | Method and system for dynamically partitioning very large database indices on write-once tables | |
US20200175070A1 (en) | Low ram space, high-throughput persistent key-value store using secondary memory | |
US8838551B2 (en) | Multi-level database compression | |
KR101708261B1 (ko) | 개별 액세스 가능한 데이터 유닛의 스토리지 관리 | |
US11580162B2 (en) | Key value append | |
KR100856245B1 (ko) | 파일 시스템 장치 및 그 파일 시스템의 파일 저장 및 파일 탐색 방법 | |
US20040205044A1 (en) | Method for storing inverted index, method for on-line updating the same and inverted index mechanism | |
TW201841122A (zh) | 鍵值儲存樹 | |
US20140359233A1 (en) | Read-write control method for memory, and corresponding memory and server | |
US11886401B2 (en) | Database key compression | |
US20110153677A1 (en) | Apparatus and method for managing index information of high-dimensional data | |
CN111831691B (zh) | 一种数据读写方法及装置、电子设备、存储介质 | |
WO2011137684A1 (zh) | 基于嵌入式系统的信息记录的检索方法和装置 | |
US8285691B2 (en) | Binary method for locating data rows in a compressed data block | |
CN116048396B (zh) | 基于日志结构化合并树的数据存储装置和存储控制方法 | |
EP2164005B1 (en) | Content addressable storage systems and methods employing searchable blocks | |
CN115827653B (zh) | 一种用于htap和海量数据的纯列式更新方法及装置 | |
Zhang | Towards Space-Efficient High-Performance In-Memory Search Structures | |
CN114691681A (zh) | 数据处理方法、装置、电子设备及可读存储介质 | |
CN115729471A (zh) | 一种重删查询方法、装置、设备和存储介质 | |
CN105956164A (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 |