CN104484471B - 一种高性能数据存储引擎的实现方法 - Google Patents
一种高性能数据存储引擎的实现方法 Download PDFInfo
- Publication number
- CN104484471B CN104484471B CN201410850174.7A CN201410850174A CN104484471B CN 104484471 B CN104484471 B CN 104484471B CN 201410850174 A CN201410850174 A CN 201410850174A CN 104484471 B CN104484471 B CN 104484471B
- Authority
- CN
- China
- Prior art keywords
- data
- page
- version
- metadata
- endpage
- 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
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/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2255—Hash tables
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种高性能数据存储引擎的实现方法。本引擎主要用于批量追加数据,数据更新操作较少,且仅需基于键值的等值查询的使用场景。因而,并发访问方面,本引擎支持单写多读,即一个写操作可以和多个读操作并发,多个写操作之间只能串行执行。本引擎中存储的每一条数据都需要一个键值,多条数据的键值可以重复,读取数据时,只能基于该键值进行等值查询。性能方面,数据入库性能与增量数据的数据量呈线性关系,且仅与增量数据量有关,即使存量数据达到千亿行的规模,入库性能也不会呈现明显衰减。
Description
技术领域
本发明属于K-V类数据库存储引擎领域,尤其是涉及一种利用键值的哈希值组织数据存储结构的方法。
背景技术
当前,基于哈希的K-V类数据库存储引擎已经被广泛使用,由于其查询时的时间复杂度低,因而对于精确查询场景,往往可以获得很高的查询性能。但是,公知方案中,随着数据入库量增加,往往需要对数据进行重整,当存量数据积累到一定规模时,入库性能就会出现较严重的非线性衰减;此外,为了支持复杂的并发事务模型、提升事务吞吐量,往往需要引入log机制,这对于大批量数据追加、事务回滚等操作的性能都是不利的。
发明内容
本发明要解决的问题是提供一种基于哈希的K-V型数据库存储引擎,降低引擎的实现复杂度,保证性能的稳定性、以及写操作时的响应速度。
为了达到上述目的,本发明采取的技术方案为:一种高性能数据存储引擎的实现方法,其特征在于,包括如下步骤:
1.1 本引擎使用Key-value方式存储数据;基于Key的哈希值,组织value的存储结构;存储结构以页面为单位,包括元数据和数据两部分;
1.2 所述元数据分为哈希散列表和删除标记两部分,每个哈希值对应一个散列表元素;
1.3 所述每个散列表元素存储发生哈希冲突的数据,包括哈希冲突链的起始页面编号、冲突链尾页编号,以及尾页的空闲空间的偏移量;
1.4 数据存储空间中,存储的每一条数据均包括以下内容:(一)Key值;(二)本条数据的入库次序号;(三)本条数据的value;
1.5 所述删除标记由一个位图表示,位图的每一个比特对应一个入库次序号,为0表示数据有效,为1表示数据已删除;
1.6 数据存储空间中,每个页面都在固定位置存储下一个页面的编号,从而构成页面链表;链表的最后一个页面在页面编号位置存储一个结束标记,用于标识链表尾;
1.7 所述元数据分两个版本,一个称元数据1,另一个称元数据2,其中一个为读版本,另一个为写版本;
1.8 读取数据时,每个读数据请求均获得一个当前元数据读版本的只读快照,并依此快照访问数据存储空间;
1.9 写数据时,在元数据的写版本上进行操作,写版本是当前读版本的一个可写快照;写数据时,只允许串行写入,当一个写操作正在被处理时,其他写请求将被阻塞;
1.10 写操作在提交时,将当前的写版本元数据切换为当前读版本;提交结束后,再发起的读请求都使用新的读版本元数据;
1.11 更新和删除操作,都被定义为写操作,与数据追加操作互斥;
1.12 删除数据时,更新写版本元数据的删除标记;提交时将当前写版本元数据切换为读版本;
1.13 更新数据时,将更新操作转化成一个删除操作和一个写操作;提交时将当前写版本元数据切换为读版本。
进一步的,步骤1.1所述页面的尺寸可由用户指定。
进一步的,步骤1.2所述元数据的哈希散列表元素个数也即哈希值的取值范围是一个恒定值,可由用户指定。
进一步的,步骤1.5所述入库次序号为非负整数,在入库时生成,从0开始递增,中间不允许出现气泡。
进一步的,步骤1.8所述读取数据的具体流程如下:
2.1 将当前读版本元数据复制成一个只读快照;
2.2 将查询的数据key值带入哈希函数,取得其哈希值,根据哈希值到只读快照的散列表中获取冲突链的起始页面位置和尾页空闲空间偏移;
2.3 从起始页面开始读取数据,将每一条数据的Key值和查询的数据key值比较,如果相等则将这条数据加入结果集;
2.4 循环读取当前页面中的数据,一个页面搜索完成,则通过其页面偏移读取下一页面,直到尾页的空闲空间偏移处为止;
2.5 遍历只读快照的删除标记,将比特值为1的位置对应的入库次序号的数据行从结果集中删除;
2.6 返回结果集。
进一步的,步骤1.9所述写数据操作的具体流程如下:
3.1 将当前读版本元数据复制成一个可写快照,作为写版本元数据,并锁定写版本元数据,阻止并发写入;
3.2 将要写入的数据key值带入哈希函数,取得其哈希值,根据哈希值到可写快照的散列表中获取冲突链的尾页位置和尾页空闲空间偏移;
3.3 如果尾页空间足够,则将数据追加至尾页空闲空间,并更新可写快照对应的尾页空闲空间偏移;
3.4 如果尾页空间不足,则在存储空间的尾部再分配一个新的页面,新页面的页面编号位置存储结束标记,原尾页面的页面编号位置存储新页面的页面编号,将数据追加至新的页面,并更新对应的尾页位置、以及尾页空闲空间偏移;
3.5 将当前写版本元数据与当前读版本元数据进行切换。
进一步的,步骤1.12所述删除数据的操作具体流程为:
4.1 将当前读版本元数据复制成一个可写快照,作为写版本元数据,并锁定写版本元数据,阻止并发写入;
4.2 将要删除的数据key值带入哈希函数,取得其哈希值,根据哈希值到可写快照的散列表中获取冲突链的起始页面位置和尾页空闲空间偏移;
4.3 从起始页面开始扫描数据,将每一条数据的Key值和‘x’比较,如果相等,则将这条数据的入库次序号对应的可写快照中删除位图的相应比特置1;
4.4 循环读取当前页面中的数据,一个页面搜索完成,则通过其页面偏移读取下一页面,直到尾页的空闲空间偏移处为止;
4.5 将当前写版本元数据与当前读版本元数据进行切换。
本发明的有益效果为:本发明提出了一种基于哈希的K-V型数据存储引擎的实现方法,该方法舍弃了复杂的并发事务模型,并发方面仅支持单写多读,不引入任何log,增加或删除数据时不对数据进行重整,写操作abort时不做数据回滚,从而降低了引擎的实现复杂度,保证了批量数据追加场景下入库性能的稳定性、以及写操作abort时的响应速度。基于上述特性,本引擎十分适合以批量串行追加数据为主,更新、删除操作很少的应用场景。
附图说明
图1是本发明的数据存储方式图。
图2是本发明写数据操作的示意图。
具体实施方式
下面结合具体实施例对本发明作进一步的说明。
本发明提供了一种基于哈希的K-V型数据库存储引擎,存储上分为元数据和数据两部分,其存储格式参考附图1。如附图1所示,元数据分为哈希散列表和删除标记两部分,每个哈希值对应一个散列表元素。其中,每个散列表元素包括哈希冲突链的起始页面编号、冲突链尾页编号,以及尾页的空闲空间的偏移量。散列表元素个数(即哈希值个数)是固定的。此外,删除标记由一个位图表示,每一个比特代表一行数据,为0表示数据有效,为1表示数据已删除。数据存储空间的页面中,每一条数据都包含以下信息:Key值、入库次序号、以及value值。其中,入库次序号为非负整数,在入库时生成,从0开始递增,中间不允许出现气泡。此外,数据页面都在固定位置存储下一个页面的编号,从而构成页面链表;链表的最后一个页面在页面编号位置存储一个结束标记,用于标识链表尾。
本引擎的元数据分两个版本,一个称元数据1,另一个称元数据2,其中一个为读版本,另一个为写版本,如摘要附图所示。读取数据时,每个读数据请求均获得一个当前元数据读版本的只读快照,并依此快照访问数据存储空间;写数据时,在元数据的写版本上进行操作,写版本是当前读版本的一个可写快照;写操作在提交时,将当前的写版本元数据切换为当前读版本;提交结束后,再发起的读请求皆使用新的读版本元数据。
写入数据时,数据以追加方式写入冲突链的尾页中,如果这个页面空间不足,则在存储空间的尾部再分配一个新的页面,新页面的页面编号位置存储结束标记,原尾页面的页面编号位置存储新页面的页面编号。
数据查询流程如下:(如,查询条件为key=x)
1.将当前读版本元数据复制成一个只读快照;
2.将‘x’带入哈希函数,取得其哈希值,根据哈希值到只读快照的散列表中获取冲突链的起始页面位置和尾页空闲空间偏移;
3.从起始页面开始读取数据,将每一条数据的Key值和‘x’比较,如果相等则将这条数据加入结果集;
4.循环读取当前页面中的数据,一个页面搜索完成,则通过其页面偏移读取下一页面,直到尾页的空闲空间偏移处为止;
5.遍历只读快照的删除标记,将比特值为1的位置对应的入库次序号的数据行从结果集中删除;
6.返回结果集。
如图2所示,***数据流程如下:(如,***的数据key值为x)
1.将当前读版本元数据复制成一个可写快照,作为写版本元数据,并锁定写版本元数据,阻止并发写入;
2.将‘x’带入哈希函数,取得其哈希值,根据哈希值到可写快照的散列表中获取冲突链的尾页位置和尾页空闲空间偏移;
3.如果尾页空间足够,则将数据追加至尾页空闲空间,并更新可写快照对应的尾页空闲空间偏移;
4.如果尾页空间不足,则在存储空间的尾部再分配一个新的页面,新页面的页面编号位置存储结束标记,原尾页面的页面编号位置存储新页面的页面编号,将数据追加至新的页面,并更新对应的尾页位置、以及尾页空闲空间偏移;
5.将当前写版本元数据与当前读版本元数据进行切换。
删除数据流程如下:(如,删除条件为key=x)
1.将当前读版本元数据复制成一个可写快照,作为写版本元数据,并锁定写版本元数据,阻止并发写入;
2.将‘x’带入哈希函数,取得其哈希值,根据哈希值到可写快照的散列表中获取冲突链的起始页面位置和尾页空闲空间偏移;
3.从起始页面开始扫描数据,将每一条数据的Key值和‘x’比较,如果相等,则将这条数据的入库次序号对应的可写快照中删除位图的相应比特置1;
4.循环读取当前页面中的数据,一个页面搜索完成,则通过其页面偏移读取下一页面,直到尾页的空闲空间偏移处为止;
5.将当前写版本元数据与当前读版本元数据进行切换。
更新(update)操作,转换成一个删除操作和一个***操作。
具体的,可以将本发明提出的存储引擎,实现为一个关系数据库的哈希索引。其中,将关系数据库中的数据行号作为入库次序号;以索引列的值为Key,以关系数据库中的数据行号为value。由于关系数据库中的数据行号同时做为本引擎的入库次序号和value,因而只存储一份即可,这样可以节省存储空间。
例如:数据表建表语句为:
Create table t(a int,b varchar(10));
创建索引的语句为:
Create hash index on t.a;
在这个例子中,如使用本引擎的方法实现哈希索引,那么t表的a列即作为本引擎的Key;a列值和数据行号则作为本引擎对应Key的数据。对a列等值查询时,先访问本引擎的方法实现的索引,获得满足条件的所有t表行号,再利用这些行号进行物化即可。
Claims (7)
1.一种高性能数据存储引擎的实现方法,其特征在于,包括如下步骤:
1.1本引擎使用Key-value方式存储数据;基于Key的哈希值,组织value的存储结构;存储结构以页面为单位,包括元数据和数据两部分;
1.2所述元数据分为哈希散列表和删除标记两部分,每个哈希值对应一个散列表元素;
1.3每个散列表元素存储发生哈希冲突的数据,包括哈希冲突链的起始页面编号、冲突链尾页编号,以及尾页的空闲空间的偏移量;
1.4数据存储空间中,存储的每一条数据均包括以下内容:(一)Key值;(二)本条数据的入库次序号;(三)本条数据的value;
1.5所述删除标记由一个位图表示,位图的每一个比特对应一个入库次序号,为0表示数据有效,为1表示数据已删除;
1.6数据存储空间中,每个页面都在固定位置存储下一个页面的编号,从而构成页面链表;链表的最后一个页面在页面编号位置存储一个结束标记,用于标识链表尾;
1.7所述元数据分两个版本,一个称元数据1,另一个称元数据2,其中一个为读版本,另一个为写版本;
1.8读取数据时,每个读数据请求均获得一个当前元数据读版本的只读快照,并依此快照访问数据存储空间;
1.9写数据时,在元数据的写版本上进行操作,写版本是当前读版本的一个可写快照;写数据时,只允许串行写入,当一个写操作正在被处理时,其他写请求将被阻塞;
1.10写操作在提交时,将当前的写版本元数据切换为当前读版本;提交结束后,再发起的读请求都使用新的读版本元数据;
1.11更新和删除操作,都被定义为写操作,与数据追加操作互斥;
1.12删除数据时,更新写版本元数据的删除标记;提交时将当前写版本元数据切换为读版本;
1.13更新数据时,将更新操作转化成一个删除操作和一个写操作;提交时将当前写版本元数据切换为读版本。
2.根据权利要求1所述的一种高性能数据存储引擎的实现方法,其特征在于,步骤1.1所述页面的尺寸由用户指定。
3.根据权利要求1所述的一种高性能数据存储引擎的实现方法,其特征在于,步骤1.2所述元数据的哈希散列表元素个数也即哈希值的取值范围是一个恒定值,可由用户指定。
4.根据权利要求1所述的一种高性能数据存储引擎的实现方法,其特征在于,步骤1.5所述入库次序号为非负整数,在入库时生成,从0开始递增,中间不允许出现气泡。
5.根据权利要求1所述的一种高性能数据存储引擎的实现方法,其特征在于,步骤1.8所述读取数据的具体流程如下:
2.1将当前读版本元数据复制成一个只读快照;
2.2将查询的数据key值带入哈希函数,取得其哈希值,根据哈希值到只读快照的散列表中获取冲突链的起始页面位置和尾页空闲空间偏移;
2.3从起始页面开始读取数据,将每一条数据的Key值和查询的数据key值比较,如果相等则将这条数据加入结果集;
2.4循环读取当前页面中的数据,一个页面搜索完成,则通过其页面偏移读取下一页面,直到尾页的空闲空间偏移处为止;
2.5遍历只读快照的删除标记,将比特值为1的位置对应的入库次序号的数据行从结果集中删除;
2.6返回结果集。
6.根据权利要求1所述的一种高性能数据存储引擎的实现方法,其特征在于,步骤1.9所述写数据的具体流程如下:
3.1将当前读版本元数据复制成一个可写快照,作为写版本元数据,并锁定写版本元数据,阻止并发写入;
3.2将要写入的数据key值带入哈希函数,取得其哈希值,根据哈希值到可写快照的散列表中获取冲突链的尾页位置和尾页空闲空间偏移;
3.3如果尾页空间足够,则将数据追加至尾页空闲空间,并更新可写快照对应的尾页空闲空间偏移;
3.4如果尾页空间不足,则在存储空间的尾部再分配一个新的页面,新页面的页面编号位置存储结束标记,原尾页面的页面编号位置存储新页面的页面编号,将数据追加至新的页面,并更新对应的尾页位置、以及尾页空闲空间偏移;
3.5将当前写版本元数据与当前读版本元数据进行切换。
7.根据权利要求1所述的一种高性能数据存储引擎的实现方法,其特征在于,步骤1.12所述删除数据的操作具体流程为:
4.1将当前读版本元数据复制成一个可写快照,作为写版本元数据,并锁定写版本元数据,阻止并发写入;
4.2将要删除的数据key值带入哈希函数,取得其哈希值,根据哈希值到可写快照的散列表中获取冲突链的起始页面位置和尾页空闲空间偏移;
4.3从起始页面开始扫描数据,将每一条数据的Key值和‘x’比较,如果相等,则将这条数据的入库次序号对应的可写快照中删除位图的相应比特置1;
4.4循环读取当前页面中的数据,一个页面搜索完成,则通过其页面偏移读取下一页面,直到尾页的空闲空间偏移处为止;
4.5将当前写版本元数据与当前读版本元数据进行切换。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410850174.7A CN104484471B (zh) | 2014-12-31 | 2014-12-31 | 一种高性能数据存储引擎的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410850174.7A CN104484471B (zh) | 2014-12-31 | 2014-12-31 | 一种高性能数据存储引擎的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104484471A CN104484471A (zh) | 2015-04-01 |
CN104484471B true CN104484471B (zh) | 2017-09-15 |
Family
ID=52759012
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410850174.7A Active CN104484471B (zh) | 2014-12-31 | 2014-12-31 | 一种高性能数据存储引擎的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104484471B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106649412B (zh) | 2015-11-04 | 2021-05-04 | 阿里巴巴集团控股有限公司 | 一种数据处理方法和设备 |
CN105491101B (zh) * | 2015-11-17 | 2018-09-21 | 华为技术有限公司 | 数据的处理方法和装置 |
CN106897315B (zh) * | 2015-12-21 | 2020-09-29 | 华为技术有限公司 | Kv项有效性获取方法以及装置 |
CN106959888B (zh) * | 2016-01-11 | 2020-09-04 | 杭州海康威视数字技术股份有限公司 | 云存储***中的任务处理方法及装置 |
CN106557571A (zh) * | 2016-11-23 | 2017-04-05 | 福建亿榕信息技术有限公司 | 一种基于k‑v存储引擎的数据去重方法及装置 |
CN108446363B (zh) * | 2018-03-13 | 2021-05-25 | 北京奇安信科技有限公司 | 一种kv引擎的数据处理方法及装置 |
CN110555520A (zh) * | 2018-05-30 | 2019-12-10 | 北京三星通信技术研究有限公司 | 执行卷积操作的方法、相应的处理装置及电子设备 |
CN110691219A (zh) * | 2019-09-11 | 2020-01-14 | 视联动力信息技术股份有限公司 | 一种数据处理的方法及装置、电子设备、存储介质 |
CN113032348A (zh) * | 2021-05-25 | 2021-06-25 | 湖南省第二测绘院 | 一种空间数据管理方法、***及计算机可读存储介质 |
CN114356230B (zh) * | 2021-12-22 | 2024-04-23 | 天津南大通用数据技术股份有限公司 | 一种提高列存储引擎读性能的方法及*** |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101183383A (zh) * | 2007-12-17 | 2008-05-21 | 中国科学院计算技术研究所 | 一种快照***及其使用方法 |
CN103473314A (zh) * | 2013-09-11 | 2013-12-25 | 北京思特奇信息技术股份有限公司 | 一种基于共享内存的键值对存储方法及装置 |
CN103500183A (zh) * | 2013-09-12 | 2014-01-08 | 国家计算机网络与信息安全管理中心 | 一种基于多个相关字段组合索引存储结构及建立、查询与维护方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6857001B2 (en) * | 2002-06-07 | 2005-02-15 | Network Appliance, Inc. | Multiple concurrent active file systems |
-
2014
- 2014-12-31 CN CN201410850174.7A patent/CN104484471B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101183383A (zh) * | 2007-12-17 | 2008-05-21 | 中国科学院计算技术研究所 | 一种快照***及其使用方法 |
CN103473314A (zh) * | 2013-09-11 | 2013-12-25 | 北京思特奇信息技术股份有限公司 | 一种基于共享内存的键值对存储方法及装置 |
CN103500183A (zh) * | 2013-09-12 | 2014-01-08 | 国家计算机网络与信息安全管理中心 | 一种基于多个相关字段组合索引存储结构及建立、查询与维护方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104484471A (zh) | 2015-04-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104484471B (zh) | 一种高性能数据存储引擎的实现方法 | |
CN109213772B (zh) | 数据存储方法及NVMe存储*** | |
US10496621B2 (en) | Columnar storage of a database index | |
EP3026578B1 (en) | N-bit compressed versioned column data array for in-memory columnar stores | |
CN107423422B (zh) | 基于网格的空间数据分布式存储及检索方法和*** | |
CN108369587B (zh) | 创建用于交换的表 | |
US9047330B2 (en) | Index compression in databases | |
US9268804B2 (en) | Managing a multi-version database | |
CN103823865A (zh) | 一种数据库主存索引方法 | |
CN105117417A (zh) | 一种读优化的内存数据库Trie树索引方法 | |
CN105117415A (zh) | 一种优化的ssd数据更新方法 | |
US10521117B2 (en) | Unified table delta dictionary memory size and load time optimization | |
US10289709B2 (en) | Interleaved storage of dictionary blocks in a page chain | |
US20130013648A1 (en) | Method for database storage of a table with plural schemas | |
WO2020041950A1 (zh) | 一种基于b+树索引的数据更新方法、装置及存储装置 | |
US20110153580A1 (en) | Index Page Split Avoidance With Mass Insert Processing | |
US20160125021A1 (en) | Efficient updates in non-clustered column stores | |
CN110515897B (zh) | Lsm存储***读性能的优化方法及*** | |
US20120317384A1 (en) | Data storage method | |
US20150186442A1 (en) | In-place index repair | |
JP2019067304A (ja) | データベース処理装置、グループマップファイル生産方法及びプログラム | |
JP6006740B2 (ja) | インデックス管理装置 | |
CN115344603A (zh) | 运价数据存储方法、装置、电子设备和计算机存储介质 | |
CN106897315A (zh) | Kv项有效性获取方法以及装置 | |
KR100810666B1 (ko) | 플래시 메모리를 저장장치로 사용하는 기기를 위한 데이터색인 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |