数据库存取策略对比
零星的搞了很久的数据库,包括关系数据库、图数据库和键值数据库,今天先来抛砖引玉做个对比。
数据库中比较核心的技术无非以下三个方面:查询、事务、存储。今天先来进行存储策略的对比。
关系数据库存取策略
元组读写过程
读取元组
构建表信息和元组模式(每个进程的本地内存 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 读取
以上就是数据库存储的基本脉络,如果对某一个环节感兴趣,可以切入进去详细了解~
版权声明: 本文为 InfoQ 作者【小舰】的原创文章。
原文链接:【http://xie.infoq.cn/article/3e4bbd0d16728db0b5f78993a】。文章转载请联系作者。
评论