前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LSM树 与B+树比较

LSM树 与B+树比较

作者头像
java达人
发布2022-05-16 15:21:27
7070
发布2022-05-16 15:21:27
举报
文章被收录于专栏:java达人java达人

现在假设有 1000 个节点的key。对于磁盘,一定是将这1000个节点依次写入磁盘的速度最快。但是这样读很糟糕,因为key在磁盘中完全乱了,每次读都得扫描。

那么,为了使读取性能尽可能高,磁盘中的数据必须是有序的。这就是B+树的原理,但是写起来就很糟糕,因为会产生大量的随机IO,磁盘寻道速度跟不上。

关于b树

B+树最大的性能问题是会产生大量的随机io。随着新数据的插入,叶子节点会慢慢分裂。逻辑上连续的叶节点通常在物理上不连续,甚至相距很远。在做范围查询的时候,会产生大量的读取随机io。

对于大量的随机写入,同样如此。比如insert key跨度很大,7 -> 1000 -> 3 -> 2000... 新插入的数据存储在磁盘上,会产生大量的随机写IO。

例如,Oracle 的常用索引使用 B+ 树。下面是一个B+树的例子

根节点和分支节点很简单,记录每个叶子节点的最小值,用指针指向叶子节点。

叶节点中的每个键值都指向真实的数据块(如Oracle中的ROWID),每个叶节点都有一个前继指针和一个后继指针。这是为了在做范围查询时,在叶子节点之间直接跳转,避免回溯到分支和后续节点。

关于lsm树

LSM 树本质上是读写之间的平衡。与B+树相比,它牺牲了部分读取性能来提高写入性能。

其原理是将一棵大树分裂成n棵小树,先写入内存(不存在内存中的seek速度问题,所以随机写入的性能大大提高)。在内存中构建了一个有序的小树。随着小树越来越大,内存中的小树会被刷新到磁盘。读取的时候,因为我们不知道数据在哪棵树上,所以必须遍历所有的树,但是每棵树中的数据都是有序的。

以上就是LSM树最本质的原理,有了原理,再看具体的技术就很简单了:

关于lsm内存结构,可以是B+树,还可以为跳跃表(skip-list)或是一个有序字符串表(SSTables)。

我们以跳表作为内存结构例子,leveldb,hbase都使用跳表。

跳表SkipList,顾名思义是链表的一种,或者说它是单链表的变异实现,使用跳表可以将查询操作的复杂度控制到θ(lg N),而普通的链表只能通过顺序查找,复杂度为θ(N),如此跳表的优势就很明显了,虽然它是通过以空间换时间搞定的。

跳表通过对间隔的数据做一个标签索引,产生了多层单链表,在最高层依次确定查找数据的范围,最终将范围缩小到可接受值,我们看跳表其实就是一个二叉查找树的变形,只是所有的数据都在最左段,其他节点用来建立查找索引,如此跳表的插入删除就比二叉查找树方便多了

wal日志 首先,我想说一下为什么我们需要wal(写前日志)。很简单,因为数据是先写入内存的。如果断电,内存中的数据将会丢失。因此,为了保护内存中的数据,我们需要先将日志文件记录在磁盘上。当内存中的数据刷新到磁盘时,我们可以丢弃相应的日志文件。

什么是memstore、storefile? 这很简单。如上所述,LSM 树只是一堆小树。内存中的小树叫做memstore。每次flush时,内存中的 memstore 都会成为磁盘上的storefile。

为什么有一个compact过程? 这很简单。随着小树越来越多,读取性能会越来越差。因此,需要在适当的时候合并磁盘中的小树,多个小树将成为一棵大的树结构。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于b树
  • 关于lsm树
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档