LSM存储引擎| 豆包MarsCode AI刷题

73 阅读2分钟

前几篇文章我们介绍了InnoDB存储引擎,然后在学习TiDB数据库,感觉里面RocksDB存储引擎LSM也蛮有意思的。

1. 引言

“我为什么要关心内部数据库存储引擎的操作?我整个开发过程中,都不会从头开始实现自己的存储引擎,直接调用数据库不就完事了嘛?”

开发一个应用程序,不可避免与数据的读写打交道,而数据的读与写决定了应用程序的性能和吞吐量。也就是说,我们可能需要了解内部数据库存储引擎的工作原理,以便为您的应用程序做出适当的设计选择,面对不同业务类型(OLTP、OLAP),选用不同的数据库(HTAP)。

本文将解释市面常见存储引擎(LSM存储引擎和面向页面的存储引擎)中的一种,LSM存储引擎(日志结构存储引擎)

2. 主要组件

2.1. 内存上的MemTable

MemTable 是 LSM存储引擎中的一个重要组件,它主要用于暂存写入的数据,直到这些数据被持久化到磁盘上。

MemTable可以用红黑树、跳表和哈希跳表等来实现。有关这些实现的权衡,请查看RocksDB wiki

对于写入操作。我们将其写入内存,这比持久性存储要快,最终,MemTable 将超过预定义的内存阈值,需要将其刷新到磁盘,虽然我们可以定义自己的写入格式,但我们可以将 MemTable 以排序的方式写入磁盘作为 SSTable。一旦数据写入磁盘,数据就变得不可变(SSTable 无法修改)。因此,新的写入将转到新的 MemTable,而对先前 MemTable 中现有数据的更新或删除等操作将存储在新的 MemTable 中。

对于读取操作。我们首先检查当前内存表,如果当前内存表无法满足读取要求(数据可能存在,但由于已刷新到磁盘,因此不再位于内存中),则我们按创建顺序的降序检查最近创建的 SSTable,直到找到所需的记录(或者可能根本找不到)。由于 SSTable 已排序,因此可以使用二进制搜索在文件中找到它,从而加快读取速度。

2.2. 磁盘上的SSTable

每个SSTable是一个有序(按key来排序)的键值对集合,而且不可变。

相对于简单哈希索引的优势:

  • 合并 SSTables 类似于合并排序
  • 要查找某个键是否存在,我们不需要内存中所有键的索引,而是可以每隔几千字节保留一个索引,然后执行扫描(稀疏索引)
  • 范围查询可以在写入磁盘之前进行压缩,稀疏索引只需要找到压缩段的起始位置

参考链接:

①:medium.com/@pnk.tanwar…

②:medium.com/@dwivedi.an…

③:edward-huang.com/distributed…

④:www.mauriciopoppe.com/notes/compu…