Storage 1 主要介绍了 slotted-page 组织数据的情况。但是这种方式会有一些问题比如

1. 页分裂 (比如在一个页上面操作,后续对其进行操作可能会有删除的操作后续可能需要使用 compaction 来合并对应页以释放空间)

2. 无用的 io 消耗。比如说如果我们使用 MySQL 我们要拿单个数据我们最小的查询单位是页,那么我们最少需要读取 16kb 页大小的数据,然后再寻址访问对应数据。

3. 随机的 io 访问,可能会导致我们到处寻找大量不连续的页,但是我们又只需要这些页里面的某些小数据,造成大量随机访问。

 

Log-Structured Storage

所以为了解决 slotted-page 组织数据的问题,有了高性能插入数据库或者 k-v 数据库经常会使用的数据组织结构 log-structured. 他的特点就是永远往下写,数据 persist 了之后就不会再去修改,当我们需要更新的时候我们会追加一个更新操作,而不是满磁盘找数据页然后读进内存,然后再更新再写回。这样效率就会高非常多,又因为在机械硬盘时代,如果我们一直对一个文件进行追加,我们可以充分受益于顺序读写获得超高的 io 效率。

但是任何东西都是有代价的,当我们不停追加内容的时候,我们终归有一天会写满 files 或者将它写得非常大,所以中间我们需要合并重复的数据或者直接删除不存在的数据来释放空间。

下面这张 slice 说明了这个文件,我们合并 并且有了层级的概念。我们默认不停写且无顺序的是 level0,当我们写的文件大小或者某种条件达到了我们设定的阈值。我们就将老的文件根据 key 合并排序然后变成一个更大的文件进行下一级。

 

 那么这种组织形式不太好的地方是什么呢?

1. 写放大。

2. 合并成本高。

其实早些时候很多数据库使用该数据结构都面临合并成本高的问题,甚至有一些超大规模排序合并会 stop the world 。。。这是最大的问题。

关于写放大说的是,当我们写入一条记录之后,但我们又不再更新它。它依然会在合并的时候被读出来,并且又重新写入到合并后的页中,反复循环直到进入更高的层级。

后面说了一些字段类型在各不同数据库中的支持,和 schema 的支持。dbms 会存储 catelog 来存储表的 schema 信息和字段的信息。

 

Reference:

https://15445.courses.cs.cmu.edu/fall2022/slides/04-storage2.pdf

 

原文地址:http://www.cnblogs.com/piperck/p/16878539.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性