0

0

什么是LSM树?LSM树的层次结构

小老鼠

小老鼠

发布时间:2025-08-16 09:57:01

|

753人浏览过

|

来源于php中文网

原创

lsm树通过将写入操作先缓存在内存的memtable中,再批量刷新到磁盘的sstables,并利用多层级结构和compaction机制,将随机写转化为顺序写,显著提升写入性能;其层次结构由内存中的memtable和immutable memtable,以及磁盘上分层的sstables组成,l0层允许数据重叠,而l1及以上层级确保sstables之间不重叠且有序,从而优化读取效率;读取时从内存逐级向下查找,结合布隆过滤器减少无效i/o,compaction在后台合并数据、消除冗余,保障数据有序性和空间回收;尽管如此,lsm树仍面临读放大(需查多个层级)、写放大(compaction导致重复写入)、空间放大(旧数据未及时清除)以及compaction资源消耗大等挑战,需通过策略调优在读写性能与资源开销间取得平衡,因此在写密集场景如nosql和日志系统中广泛应用。

什么是LSM树?LSM树的层次结构

LSM树,也就是日志结构合并树,本质上是一种为写入密集型工作负载优化的数据结构。它通过将所有写入操作首先追加到内存,然后周期性地批量刷新到磁盘,避免了传统B+树那种原地更新带来的随机写开销,从而在性能上实现了质的飞跃。

要理解LSM树,不妨把它想象成一个不断累积和整理的档案系统。我们所有的“新档案”(数据写入)都会先被扔进一个“临时收件箱”(内存中的MemTable)。这个收件箱是完全追加式的,写入速度飞快。当收件箱满了,或者达到某个阈值,它就会被“封存”起来,变成一个“不可修改的临时档案包”(Immutable MemTable),等待被“归档”到磁盘上。

磁盘上的归档过程则是由一系列“层级”(Levels)组成的。每个层级都包含多个“有序的档案卷宗”(SSTables,Sorted String Tables)。新刷下来的数据,会先进入最底层的L0。L0的SSTables可能相互重叠,数据不完全有序。但随着这些档案包被“合并”和“整理”(Compaction),它们会逐渐下沉到更深、更高级别的层级(L1, L2, ...),在这些层级中,SSTables内部以及SSTables之间的数据通常是完全有序且不重叠的。这个合并整理的过程是LSM树的核心,它确保了数据最终的有序性和查询效率,同时又将随机写变成了顺序写。

LSM树为什么在现代数据库中如此受欢迎?

传统的关系型数据库,比如那些基于B+树的系统,在面对海量的、持续的写入请求时,经常会感到力不从心。B+树的特点是数据在磁盘上是高度有序的,每次更新或插入都需要找到准确的位置,然后进行原地修改,这会带来大量的随机I/O。想象一下,你有一本厚厚的字典,每次要添加一个新词或修改一个旧词的解释,你都得找到对应的页码,小心翼翼地插入或擦除。如果这样的操作每秒发生数万次,磁盘的磁头就会像个没头苍蝇一样到处乱窜,效率自然低下。

LSM树则走了另一条路。它彻底拥抱了“追加写入”的哲学。所有新数据都像日志一样追加到内存,然后一次性批量写入磁盘。这就像我们写日记,只管往后写,不用回头修改。磁盘的顺序写入速度远高于随机写入,这是硬件特性决定的。这种设计使得LSM树在写入吞吐量上有着天然的优势,尤其是在SSD普及的今天,顺序写入的优势更加明显。此外,它对删除操作的处理也很巧妙,不是真正删除数据,而是写入一个“墓碑标记”,实际的清理工作留给了后台的合并过程,进一步减少了写入时的开销。所以,对于像NoSQL数据库、日志系统、或者任何需要处理大量写入的场景,LSM树几乎成了标配,它能让你在数据爆炸式增长的时代,依然保持系统的响应能力。

LSM树的层次结构是如何支撑其高性能读写的?

LSM树的核心魅力就在于它的层次结构和伴随的“合并”(Compaction)机制。这个结构可以大致分为内存部分和磁盘部分。

内存部分通常包含:

  • MemTable (或称Active MemTable): 这是所有新写入数据的第一站。它是一个内存中的有序数据结构,比如跳表(Skip List)或B树,保证了写入的快速和查询的有序性。所有对数据的修改(插入、更新、删除)都先发生在这里。它完全是追加式的,所以写入速度极快。
  • Immutable MemTable: 当MemTable达到预设大小后,它会“冻结”成为Immutable MemTable。此时,新的写入会切换到一个新的MemTable。Immutable MemTable是只读的,它会异步地被刷新到磁盘上,形成一个SSTable文件。这个异步刷新机制避免了写入操作被磁盘I/O阻塞。

磁盘部分则由一系列层级(Levels)组成,每个层级包含多个SSTable(Sorted String Table)文件:

ecshop仿万表网商城整站
ecshop仿万表网商城整站

该软件是以ecshop作为核心的仿制万表网的商场网站源码。万表网模板 2015最新版整体简洁大气,功能实用,是一款时尚典雅的综合类模板!样式精美的商品分类树,层次分明,分类结构一目了然。首页轮播主广告分别对应切换小广告,商品宣传更到位。独家特色增加顶级频道页面、品牌页面,以及仿京东对比功能,提升网站档次,让您的网站更加高端大气!并且全站采用div+css布局,兼容性良好,更注重页面细节,增加多种j

下载
  • L0 (Level 0): 这是Immutable MemTable刷新下来的SSTable存放的地方。L0的SSTables有一个特点:它们之间的数据范围可能重叠。这意味着如果你要查找一个键,可能需要检查L0中的多个SSTable。
  • L1, L2, ... Ln (Higher Levels): 随着数据不断从L0向下合并,它们会进入更高层级的L1、L2等。在这些层级中,SSTable内部的数据是完全有序的,而且关键的是,同一层级内的SSTables之间的数据范围通常是不重叠的。这极大地优化了读取性能,因为查找一个键时,你只需要知道它可能存在于哪个SSTable中,然后直接去那个文件查找。

而支撑这一切高效运转的,是后台持续进行的Compaction(合并)操作。Compaction是LSM树的“垃圾回收”和“整理优化”机制。它会将一个或多个低层级的SSTable与高层级的SSTable合并,生成新的、更大、更优化的SSTable,并写入到更高层级。这个过程中会处理掉重复的键(只保留最新版本)、删除标记(真正移除被删除的数据),并优化数据的物理布局。Compaction虽然会消耗CPU和I/O资源,但它发生在后台,不会阻塞前台的写入操作,并且它确保了磁盘上的数据最终是紧凑且有序的,从而保证了读取效率。

读取数据时,LSM树会从MemTable开始查找,如果没找到,就去Immutable MemTable,接着是L0,然后是L1,直到找到数据或者遍历完所有层级。由于Compaction的存在,越是底层(高层级)的数据,其有序性和紧凑性越好,查找效率也越高。这种分层查找的策略,加上布隆过滤器(Bloom Filter)等辅助结构来快速判断键是否存在于某个SSTable中,使得LSM树在读写性能之间取得了精妙的平衡。

LSM树在实际应用中会遇到哪些挑战和权衡?

虽然LSM树在写入密集型场景下表现出色,但它并非没有缺点。任何工程设计都是一种权衡,LSM树也不例外。

一个显著的挑战是读放大(Read Amplification)。由于数据可能分散在MemTable、L0的多个SSTable以及后续的多个层级中,读取一个键可能需要查询多个地方。例如,一个键在MemTable中是最新版本,但在L0和L1中可能还有旧版本的数据。虽然布隆过滤器可以帮助快速排除不存在的SSTable,但如果布隆过滤器误报或数据确实存在多个版本,就需要进行多次磁盘I/O。这在某些读多写少的应用场景下,可能会导致读性能不如B+树。

接着是写放大(Write Amplification)。写入一个字节的数据,由于Compaction过程会不断地读取旧数据、合并、再写入新数据,实际写入到磁盘的总字节数可能会远远大于原始写入的字节数。这个比例就是写放大。例如,一个键在L0中被更新了,它会和L1的数据合并,然后写入L1,如果L1满了,又会和L2合并写入L2。这就意味着一份数据可能被多次写入。高写放大不仅消耗磁盘带宽,还会加速SSD的磨损,因为SSD的写入寿命是有限的。

还有空间放大(Space Amplification)。由于删除操作只是写入墓碑标记,旧数据并不会立即被物理删除,而是在Compaction过程中才会被清理。此外,不同层级之间的数据重叠,以及为了优化写入而牺牲的紧凑性,都可能导致实际占用的磁盘空间大于数据的逻辑大小。这就像你整理文件,旧的草稿和副本还在,直到你真正清理它们。

最后,Compaction的开销和调优也是一个复杂的问题。Compaction是LSM树的生命线,但它也需要消耗大量的CPU和I/O资源。如果Compaction跟不上写入的速度,磁盘上的SSTable文件会越积越多,导致读性能急剧下降,甚至影响写入。如何根据工作负载合理配置Compaction策略(如Level Compaction vs. Size-Tiered Compaction,以及各种参数的设置),是LSM树数据库运维中的一个核心挑战,需要深厚的经验和细致的监控。没有一劳永逸的方案,往往需要针对特定业务场景进行持续的观察和调整。

这些挑战并非不可克服,LSM树的设计者和使用者通过各种优化手段(如更智能的Compaction策略、布隆过滤器、前缀编码、块压缩等)来缓解这些问题。关键在于理解LSM树的内在机制和它所带来的权衡,从而选择最适合自己应用场景的数据存储方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

790

2023.08.02

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

542

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

27

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

39

2026.01.06

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

374

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2093

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

355

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号