写点什么

数据库存取策略对比

用户头像
小舰
关注
发布于: 2021 年 04 月 15 日

零星的搞了很久的数据库,包括关系数据库、图数据库和键值数据库,今天先来抛砖引玉做个对比。

数据库中比较核心的技术无非以下三个方面:查询、事务、存储。今天先来进行存储策略的对比。

关系数据库存取策略

元组读写过程

  • 读取元组

  • 构建表信息和元组模式(每个进程的本地内存 cache 中)

  • 从共享缓冲池中读取元组

  • 有:跟模式信息解析属性值

  • 无:从文件块读取元组数据到缓冲池,再从缓冲池读取元组

  • 文件块在磁盘存储,不同介质的磁盘由存储介质管理器来适配对上层提供统一接口

  • 写出元组

  • 找到合适的有空闲空间的缓冲块

  • 空闲空间映射表,加快缓冲块空闲空间的查找

  • 将元组写入共享缓冲池中的缓冲块

  • 记录最近插入/使用的缓冲块块号(对于单个进程尽可能将数据写入一个缓冲块中)

  • 合适时间将缓冲块刷回到存储介质中

图数据库存取策略

  • 读取邻接节点

  • 免索引邻接(Neo4j/OrientDB)

  • 源节点中存储了关系地址,关系字段又存储了原节点和目标节点地址

  • 全索引(ArrangoDB)

  • 节点字段中对 id 创建哈希索引

  • 关系字段中,源节点和目的节点都创建了哈希索引

  • 查找某个节点的邻接节点,通过索引可以快速定位

  • 存储关系和节点

  • 原生图存储

  • 节点和关系存储实际的物理地址(计算出的物理地址)

  • 非原生存储

  • 通过相应的适配器接入不同的存储引擎

  • 关系数据库

  • K-V 存储

键值数据库存取策略

  • 写入数据(K-V 存储的写效率远高于读效率)

  • 根据记录的 key 值有序存储的

  • Kv 数据库在存储数据时,相邻的 key 值在存储文件中是依次顺序存储的(可以自定义 key 大小比较函数,默认通过 skiplist 来实现)

  • WAL

  • 当应用写入一条 Key:Value 记录的时候,会先往 log 文件里写入,成功后将记录插进 Memtable 中,这样基本就算完成了写入操作

  • 因为一次写入操作只涉及一次磁盘顺序写和一次内存写入,因此写入速度极快

  • 在每层 compaction 的时候进行合并/键值的更新等操作

  • 读取数据

  • 原则:读取最新的数据

  • 首先从 MemTable 中读取,没有则从 Immutable MemTable 中读取,依次 Level0/1/2 读取


以上就是数据库存储的基本脉络,如果对某一个环节感兴趣,可以切入进去详细了解~

发布于: 2021 年 04 月 15 日阅读数: 10
用户头像

小舰

关注

公众号:DLab数据实验室 2020.11.12 加入

中国人民大学硕士

评论

发布
暂无评论
数据库存取策略对比