DDIA-数据存储与检索

# 日志结构存储引擎

使用日志记录数据,仅支持追加形式的记录集合。

# 面向页的存储引擎

# 索引是基于原始数据派生而来的额外的数据结构,是为了快速定位想要的数据,也就是提高查询的性能。

# 在存储系统中重要的权衡设计:适当的索引可以加快读取速度,但是每个索引会减慢写的速度,两者需要根据实际进行权衡。

# 哈希索引:以键-值方式索引数据。

# 为什么日志采取追加方式,而不进行原地更新?

1. 追加和分段写主要是顺序写,比随机写速度更快。

2. 段文件是追加的,不可变的,故并发和崩溃恢复更为简单。

# 哈希(key-value)到SSTables(排序字符串表):改变段文件的格式,要求key-value按键排序。每个键在每个合并的段文件中只能出现一次,相比哈希日志段,有两个优点:

1. 合并段更加简单高效,即使文件大于可用内存。

2. 在文件查找特定的键时,不在需要在内存中保存所有键的索引

问题来了?写入是任意顺序的,怎么让数据按键排序?答:内存排序的数据结构:红黑树或AVL树

存储引擎的基本工作流程:

1. 当写入时,将其添加到内存中的平衡数数据结构(内存表)中。

2. 当内存表大于某个阀值时,将其作为SSTable文件写入磁盘。

3. 为了处理请求,首先在内存表查找,然后从最新的依次查找段文件。

4. 后台进程周期性执行段文件合并与压缩,并丢弃已经覆盖或删除的值。

从SSTablesdao LSM-Tree(日志结构的合并树)

LSM-Tree:基于合并与压缩排序文件的原理的存储引擎统称。

# 最广泛使用的存储引擎-B-tree

> 日志结构索引将数据库分解为可变大小的段,通常大小为几兆或更大,并且要求顺序写入端。而,B-tree将数据库分解为固定大小的块或页,每个也可以使用一个地址标识,传统大小为4K,页是操作系统读写的最小单元,这种设计更接近底层。

# 原理:某一页被指定为B-tree的根;每当查找索引的一个键时,总是从这里开始;该页面包含了若干个键和对子页的引用;每个孩子都负责一个连续范围内的键,相邻引用之间的键可以指示这些范围之间的边界。

为了保证数据库能从崩溃中恢复,B-tree增加了预写日志(WAL:write-ahead log),这是一个仅支持追加修改的文件,每个B-tree的修改必须先更新WAL然后再修改树本身的页。

你可能感兴趣的:(DDIA-数据存储与检索)