DDIA阅读笔记

本文详细探讨了数据库中的数据存储与检索技术,包括哈希索引、SSTables与LSM-Tree、B-trees以及其它索引结构。在事务处理方面,深入分析了ACID特性、不同隔离级别、读写事务操作及其优化,以及可串行化事务的实现方法。此外,还讨论了数据仓库、列式存储及其对分析处理的影响。
摘要由CSDN通过智能技术生成

第三章 数据存储与检索

从最基本的层面看,数据库只需做两件事情:向它插入数据时,它就保存数据;之后查询时,它应该返回那些数据。

数据库核心:数据结构

为了高效地查找数据库中特定键的值,需要新的数据结构:索引。背后基本想法都是保留一些额外的元数据,这些元数据作为路标,帮助定位想要的数据。

适当的索引可以加速读取查询,但每个索引都会减慢写速度。

哈希索引

最简单的索引策略就是:保存内存中的hash map,把每个键一一映射到数据文件中特定的字节偏移量,这样就可以找到每个值的位置。

实现中有以下重要问题:

  • 文件格式:更快更简单是使用二进制格式,首先以字节为单位来记录字符串的长度,之后跟上原始字符串(不需要转义)
  • 删除记录:在数据文件中追加一个特殊的删除记录(墓碑)。
  • 崩溃恢复:将每个段的hash map的快照存储在磁盘上,可以更快地加载到内存中,以此加快恢复速度
  • 部分写入的记录:在文件中包括校验值,这样可以发现损坏部分并丢弃。
  • 并发控制:一个写线程,多个读线程

追加式的设计非常不错,主要原因有以下几个:

  • 追加和分段合并主要是顺序写
  • 如果段文件是追加的或不可变的,则并发和崩溃恢复要简单得多
  • 合并旧段可以避免随着时间的推移数据文件出现碎片化的问题

哈希表索引也有其局限性:

  • 哈希表必须全部放入内存
  • 区间查询效率不高

SSTables和LSM-Tree

排序字符串表,简称为SSTable,要求key-value对的顺序按键排序。

具有以下优点:

  1. 合并段更加简单高效,即使文件大于可用内存
  2. 稀疏索引来记录某些键的偏移
  3. 可以考虑将经常请求的范围内的多个key-value对保存到一个块中并在写磁盘前将其压缩,节省磁盘空间,还减少了I/O带宽的占用
构建和维护SSTables

基本工作流程:

  • 当写入时,将其添加到内存中的平衡树数据结构中(内存表)。
  • 当内存表大于某个阈值(通常为几兆字节)时,将其作为SSTable文件写入磁盘。当SSTable写磁盘的同时,写入可以继续添加到一个新的内存表实例。
  • 为了处理读请求,首先尝试在内存表中查找键,然后是最新的磁盘段文件,接下来是次新的磁盘段文件,以此类推,直到找到目标(或为空)。
  • 后台进程周期性地执行段合并与压缩过程,以合并多个段文件,并丢弃那些已被覆盖或删除的值。

为了避免数据库崩溃最近的写入可能丢失的问题,可以在磁盘上保留单独的日志,每个写人都会立即追加到该日志

从SSTables到LSM-Tree

基于合并和压缩排序文件的原理的存储引擎通常都被称为LSM存储引擎。

性能优化
  • 查找不存在的键需要一层一层的去找,为了优化这种访问,存储引擎通常使用额外的布隆过滤器(布隆过滤器是内存高效的数据结构,用于近似计算集合的内容。如果数据库中不存在某个键,它能够很快告诉你结果,从而节省了很多对于不存在的键的不必要的磁盘读取)。

  • 大小分级:在大小分级的压缩中,较新的和较小的SSTables被连续合并到较旧和较大的SSTables。

  • 分层压缩:在分层压缩中,键的范围分裂成多个更小的SSTables,旧数据被移动到单独的“层级”

B-trees

B-tree将数据库分解成固定大小的块或页,传统上大小为4KB(有时更大)

某一页被指定为B-tree的根;每当查找索引中的一个键时,总是从这里开始。该页面包含若干个键和对子页的引用

B-tree中一个页所包含的子页引用数量称为分支因子。


更新B-tree中现有键的值,首先搜索包含该键的叶子页,更改该页的值,并将而写回到磁盘

添加新键,则需要找到其范围包含新的页,并将其添加到该页。如果页中没有足够的可用空间来容纳新键,则将其分契为两个半满的页,并且父页也需要更新以包含分裂之后的新的键范围

使B-tree可靠

B-tree底层的基本写操作是使用新数据覆盖磁盘上的旧页。

为了使数据库能从崩溃中恢复,常见的B-tree的实现需要支持磁盘上的额外的数据结构:预写日志(write-ahead log, WAL),也称为重做日志。

优化B-tree

优化措施:

  • 写时复制方案。修改的页被写入不同的位置,树中父页的新版本被创建,并指向新的位置。这种方法对并发控制也很有帮助(MVCC)
  • 保存键的缩略信息,而不是完整的键
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值