首页> 中国专利> 一种高性能数据存储引擎的实现方法

一种高性能数据存储引擎的实现方法

摘要

本发明提供了一种高性能数据存储引擎的实现方法。本引擎主要用于批量追加数据,数据更新操作较少,且仅需基于键值的等值查询的使用场景。因而,并发访问方面,本引擎支持单写多读,即一个写操作可以和多个读操作并发,多个写操作之间只能串行执行。本引擎中存储的每一条数据都需要一个键值,多条数据的键值可以重复,读取数据时,只能基于该键值进行等值查询。性能方面,数据入库性能与增量数据的数据量呈线性关系,且仅与增量数据量有关,即使存量数据达到千亿行的规模,入库性能也不会呈现明显衰减。

著录项

  • 公开/公告号CN104484471A

    专利类型发明专利

  • 公开/公告日2015-04-01

    原文格式PDF

  • 申请/专利号CN201410850174.7

  • 发明设计人 孟祥滨;孔德生;崔维力;武新;

    申请日2014-12-31

  • 分类号G06F17/30(20060101);

  • 代理机构12211 天津滨海科纬知识产权代理有限公司;

  • 代理人杨慧玲

  • 地址 300384 天津市滨海新区高新区华苑产业区海泰发展六道6号海泰绿色产业基地J-518

  • 入库时间 2023-12-17 04:31:51

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-09-15

    授权

    授权

  • 2015-04-29

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20141231

    实质审查的生效

  • 2015-04-01

    公开

    公开

说明书

技术领域

本发明属于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表行号,再利用这些行号进行物化即可。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号