业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23292 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

27|LSM Tree:LevelDB的索引是如何建立的?

通过tombstone标记删除,而非实际删除
从Memtable到各层SSTable逐层查询
Immutable Memtable刷入SSTable
Memtable达到阈值转为Immutable Memtable
数据首先写入Memtable
需要理解批量写对性能的提高及其在系统设计中的应用
采用多种机制保证数据的安全性和查询效率
通过内存和磁盘的协同工作提高写性能
LSM Tree是一种适合写多读少场景的索引结构
Segment大小的设置问题
分层存储结构限制segment数量
多路归并合并segment
稀疏索引和布隆过滤器提高查询效率
预写日志(WAL)保证数据安全性
批量读写提高性能
删除流程
读取流程
写入流程
SSTable:磁盘上的持久化部分
Immutable Memtable:不可变表
Memtable:内存中的有序结构
C1-tree:磁盘中的特殊B+树
C0-tree:内存中的树状结构
合并多次写入减少磁盘寻道开销
利用内存延迟写入磁盘
随机写入性能较差
需要递归合并、分裂调整操作
修改数据可能破坏B+树约束
优化了随机写入性能问题
广泛应用于NoSQL数据库
适合写多读少场景的索引结构
总结
课后讨论
数据压缩与合并
性能优化
LSM Tree的工作流程
现代LSM Tree结构
早期LSM Tree结构
LSM Tree的核心思想
B+树的局限性
LSM Tree概述
LSM Tree:LevelDB的索引是如何建立的?

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
上一节我们学习了数据库中非常常用的索引数据结构——B+ 树,在过去很多年里它都是数据库索引的首选实现方式,但是这种数据结构也并不是很完美。
因为,每次修改数据都很有可能破坏 B+ 树的约束,我们需要对整棵树进行递归的合并、分裂等调整操作,而不同节点在磁盘上的位置很可能并不是连续的,这就导致我们需要不断地做随机写入的操作。
众所周知,随机写入的性能是比较差的。这个问题在写多读少的场景下会更加明显,而且现在很多非关系型数据库就是为了适用写多读少的场景而设计的,比如时序数据库常常面对的 IOT 也就是物联网场景,数据会大量的产生。所以,如果用 B+ 树作为索引的实现方式,就会产生大量的随机读写,这会成为系统吞吐量的瓶颈。
但是考虑到非关系型数据库的检索,往往都是针对近期的数据进行的。不知道你会不会又一次想到 Kafka 的线性索引呢?不过很可惜,非关系型数据库的 workload 也不是完全 append only 的,我们仍然需要面对索引结构变动的需求。
那在写多读少的场景下,如何降低 IO 的开销呢?
LSM Tree(Log Structure Merge Tree)就是这样比 B+ 树更适合写多读少场景的索引结构,也广泛应用在各大 NoSQL 中。比如基于 LSM 树实现底层索引结构的 RocksDB,就是 Facebook 用 C++ 对 LevelDB 的实现,RocksDB 本身是一个 KV 存储引擎,现在被很多分布式数据库拿来做单机存储引擎,其中 LSM 树对性能的贡献功不可没。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

LSM Tree是一种适用于写多读少场景的索引结构,相比传统的B+树,它能够降低IO开销并提高系统吞吐量。LSM Tree通过延迟写入磁盘的时机,利用内存维护有序结构,并通过合并多次随机写操作来降低磁盘臂移动的开销。现代的LSM-tree已经简化了这种繁琐的结构,但核心思想仍然是一致的。LSM Tree广泛应用于各大NoSQL数据库中,如RocksDB,对于处理大量写入的场景能够获得比B+树更好的性能表现。 LSM Tree的核心组成部分包括Memtable、Immutable Table和SSTable。Memtable存储内存中的近期更新记录值,而Immutable Table则是其不可变副本,有助于避免读写冲突竞争,提高系统性能。SSTable则是在磁盘上做持久化的部分,通过多路归并的方式合并segment,实现数据的压缩和删除操作。 LSM Tree的设计理念和实现细节为读者提供了一种新的索引结构思路,能够帮助他们更好地理解和应用于实际的数据库系统中。LSM Tree通过预写日志的方式保证数据的安全性,同时采用压缩数据和标记删除的策略来优化存储和检索效率。总体而言,LSM Tree在写多读少的场景下能够带来更快的写性能提升,同时通过合并操作和特殊状态标记实现了高效的数据存储和管理。LSM Tree的实现还涉及稀疏索引和布隆过滤器,这些技术能够提高查询效率和快速过滤掉不存在的字段,为读者提供了更深入的技术理解和应用思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 那时刻
    我想最小的segment应该与内存叶相适应,一般是4k。如果是内存大叶,可能是16k吧

    作者回复: 是的 通常是内存页的整数倍

    2022-02-24
    2
    4
  • 泛岁月的涟漪
    rocksdb主要是cpp吧

    作者回复: 你说的对!我更正一下。

    2022-04-21
  • Paul Shan
    Segment是从内存到磁盘的读写单位,最小要设置成虚拟内存的页的大小。个人觉得设置成虚拟内存页的大小的整数倍都可以,太大会影响内存调度。

    作者回复: 嗯嗯 我的观点和你是一样的

    2022-02-24
  • 小麦
    MySQL InnoDB 存储引擎也提供了 MRR 优化,将批量随机写入转换成顺序写入。 此外,MySQL InnoDB 在删除行数据时也采用的标记删除,磁盘空间并不会立即回收
    2022-06-19
    3
  • 蒋某人尚需顿悟
    es的存储应该也是lsm吧,还有个fsm是什么关系呢
    2023-05-18归属地:上海
  • 药师
    每层遍历segment时也应该从最新加入的segment开始遍历吧?一层是有可能出现相同的key出现在不同的segment的情况的,那么越晚加入的到这层的segment的数据越新 如果上面成立,那是不是要维护每层segment的顺序
    2022-03-16
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部