首先来回答一个问题:为什么在磁盘中要使用b+树来进行文件存储呢?
原因还是因为树的高度低得缘故,磁盘本身是一个顺序读写快,随机读写慢的系统,那么如果想高效的从磁盘中找到数据,势必需要满足一个最重要的条件:减少寻道次数。
我们以平衡树为例进行对比,就会发现问题所在了:

先上个图

这是个平衡树,可以看到基本上一个元素下只有两个子叶节点
 
 
抽象的来看,树想要达成有效查找,势必需要维持如下一种结构:
树的子叶节点中,左子树一定小于等于当前节点,而当前节点的右子树则一定大于当前节点。只有这样,才能够维持全局有序,才能够进行查询。
 
这也就决定了只有取得某一个子叶节点后,才能够根据这个节点知道他的子树的具体的值情况。这点非常之重要,因为二叉平衡树,只有两个子叶节点,所以如果想找到某个数据,他必须重复更多次“拿到一个节点的两个子节点,判断大小,再从其中一个子节点取出他的两个子节点,判断大小。”这一过程。
 
这个过程重复的次数,就是树的高度。那么既然每个子树只有两个节点,那么N个数据的树的高度也就很容易可以算出了。
 
平衡二叉树这种结构的好处是,没有空间浪费,不会存在空余的空间,但坏处是需要取出多个节点,且无法预测下一个节点的位置。这种取出的操作,在内存内进行的时候,速度很快,但如果到磁盘,那么就意味着大量随机寻道。基本磁盘就被查死了。
 
而b树,因为其构建过程中引入了有序数组,从而有效的降低了树的高度,一次取出一个连续的数组,这个操作在磁盘上比取出与数组相同数量的离散数据,要便宜的多。因此磁盘上基本都是b树结构。
 
不过,b树结构也不是完美的,与二叉树相比,他会耗费更多的空间。在最恶劣的情况下,要有几乎是元数据两倍的格子才能装得下整个数据集(当树的所有节点都进行了分裂后)。
 
 
以上,我们就对二叉树和b树进行了简要的分析,当然里面还有非常多的知识我这里没有提到,我希望我的这个系列能够成为让大家入门的材料,如果感兴趣可以知道从哪里着手即可。如果您通过我的文章发现对这些原来枯燥的数据结构有了兴趣,那么我的目标就达到了: )
 
在这章中,我们还将对b数的问题进行一下剖析,然后给出几个解决的方向

其实toku DB的网站上有个非常不错的对b树问题的说明,我在这里就再次侵权一下,将他们的图作为说明b树问题的图谱吧,因为真的非常清晰。
http://tokutek.com/downloads/mysqluc-2010-fractal-trees.pdf

B树在插入的时候,如果是最后一个node,那么速度非常快,因为是顺序写。


但如果有更新插入删除等综合写入,最后因为需要循环利用磁盘块,所以会出现较多的随机io.大量时间消耗在磁盘寻道时间上。


如果是一个运行时间很长的b树,那么几乎所有的请求,都是随机io。因为磁盘块本身已经不再连续,很难保证可以顺序读取。
 
以上就是b树在磁盘结构中最大的问题了。
 
那么如何能够解决这个问题呢?
目前主流的思路有以下几种
1.      放弃部分读性能,使用更加面向顺序写的树的结构来提升写性能。
这个类别里面,从数据结构来说,就我所知并比较流行的是两类,
一类是COLA(Cache-Oblivious Look ahead Array)(代表应用自然是tokuDB)。
一类是LSM tree(Log-structured merge Tree)或SSTABLE
(代表的数据集是cassandra,hbase,bdb java editon,levelDB etc.).
2.      使用ssd,让寻道成为往事。
 
我们在这个系列里,主要还是讲LSM tree吧,因为这个东西几乎要一桶浆糊了。几乎所有的nosql都在使用,然后利用这个宣称自己比mysql的innodb快多少多少倍。。我对此表示比较无语。因为nosql本身似乎应该是以省去解析和事务锁的方式来提升效能。怎么最后却改了底层数据结构,然后宣称这是nosql比mysql快的原因呢?
毕竟Mysql又不是不能挂接LSM tree的引擎。。。
 
好吧,牢骚我不多说,毕竟还是要感谢nosql运动,让数据库团队都重新审视了一下数据库这个产品的本身。
 
那么下面,我们就来介绍一下LSM Tree的核心思想吧。
 
首先来分析一下为什么b+树会慢。
 
从原理来说,b+树在查询过程中应该是不会慢的,但如果数据插入比较无序的时候,比如先插入5 然后10000然后3然后800 这样跨度很大的数据的时候,就需要先“找到这个数据应该被插入的位置”,然后插入数据。这个查找到位置的过程,如果非常离散,那么就意味着每次查找的时候,他的子叶节点都不在内存中,这时候就必须使用磁盘寻道时间来进行查找了。更新基本与插入是相同的
 

那么,LSM Tree采取了什么样的方式来优化这个问题呢?
简单来说,就是放弃磁盘读性能来换取写的顺序性。
乍一看,似乎会认为读应该是大部分系统最应该保证的特性,所以用读换写似乎不是个好买卖。但别急,听我分析之。
1.      内存的速度远超磁盘,1000倍以上。而读取的性能提升,主要还是依靠内存命中率而非磁盘读的次数
2.      写入不占用磁盘的io,读取就能获取更长时间的磁盘io使用权,从而也可以提升读取效率。
因此,虽然SSTable降低了了读的性能,但如果数据的读取命中率有保障的前提下,因为读取能够获得更多的磁盘io机会,因此读取性能基本没有降低,甚至还会有提升。
而写入的性能则会获得较大幅度的提升,基本上是5~10倍左右。
 
下面来看一下细节
其实从本质来说,k-v存储要解决的问题就是这么一个:尽可能快得写入,以及尽可能快的读取。
让我从写入最快的极端开始说起,阐述一下k-v存储的核心之一—树这个组件吧。
 
我们假设要写入一个1000个节点的key是随机数的数据。
 
对磁盘来说,最快的写入方式一定是顺序的将每一次写入都直接写入到磁盘中即可。
但这样带来的问题是,我没办法查询,因为每次查询一个值都需要遍历整个数据才能找到,这个读性能就太悲剧了。。
 
那么如果我想获取磁盘读性能最高,应该怎么做呢?把数据全部排序就行了,b树就是这样的结构。
 
那么,b树的写太烂了,我需要提升写,可以放弃部分磁盘读性能,怎么办呢?
 
简单,那就弄很多个小的有序结构,比如每m个数据,在内存里排序一次,下面100个数据,再排序一次……这样依次做下去,我就可以获得N/m个有序的小的有序结构。
 
在查询的时候,因为不知道这个数据到底是在哪里,所以就从最新的一个小的有序结构里做二分查找,找得到就返回,找不到就继续找下一个小有序结构,一直到找到为止。
 
很容易可以看出,这样的模式,读取的时间复杂度是(N/m)*log2N 。读取效率是会下降的。
这就是最本来意义上的LSM tree的思路。
那么这样做,性能还是比较慢的,于是需要再做些事情来提升,怎么做才好呢?
 
于是引入了以下的几个东西来改进它
1.      Bloom filter : 就是个带随即概率的bitmap,可以快速的告诉你,某一个小的有序结构里有没有指定的那个数据的。于是我就可以不用二分查找,而只需简单的计算几次就能知道数据是否在某个小集合里啦。效率得到了提升,但付出的是空间代价。
2.      小树合并为大树: 也就是大家经常看到的compact的过程,因为小树他性能有问题,所以要有个进程不断地将小树合并到大树上,这样大部分的老数据查询也可以直接使用log2N的方式找到,不需要再进行(N/m)*log2n的查询了。
 
这就是LSMTree的核心思路和优化方式。
不过,LSMTree也有个隐含的条件,就是他实现数据库的insert语义时性能不会很高,原因是,insert的含义是: 事务中,先查找该插入的数据,如果存在,则抛出异常,如果不存在则写入。这个“查找”的过程,会拖慢整个写入。

这样,我们就又介绍了一种k-v写入的模型啦。

B+树与LSM树的区别与联系相关推荐

  1. B树、B+树、LSM树以及其典型应用场景

    前言 动态查找树主要有:二叉查找树.平衡二叉树.红黑树.B树.B+树.前面三种是典型的二叉查找树,查找的时间复杂度是O(log2N)与树的深度有关系,那么降低树的深度也就可以提升查找效率.这时就提出了 ...

  2. 数据密集型系统设计:索引及存储(B树、LSM树、OLTP及OLAP)

    1.数据索引结构 一个数据库在最基础的层次上需要完成两件事情:当你把数据交给数据库时,它应当把数据存储起来:而后当你向数据库要数据时,它应当把数据返回给你.世界上最简单的数据库可以用两个Bash函数实 ...

  3. 数据库关于B树、B+树、LSM树的简介

    B树 在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序.这种数据结构能够让查找数据.顺序访问.插入数据及删除的动作,都在对数时间内完成.B树,概括来说是一个一般化的二叉查找 ...

  4. B+树和LSM树对比

    1 B树 B树是一种平衡多路搜索树,B树与红黑树最大的不同在于,B树的结点可以有多个子女,从几个到几千个.那为什么又说B树与红黑树很相似呢?因为与红黑树一样,一棵含n个结点的B树的高度也为O(lgn) ...

  5. 分布式存储引擎(B树、LSM树)原理

    分布式存储引擎(B树.LSM树)原理 B+树结构 Update-in-place 常见于传统关系型数据库(MySQL.Oracle),按key维护B+树,数据存放在叶子结点(每个页对应的节点可以有更高 ...

  6. 3层b+树索引访问磁盘次数_从B+树到LSM树,及LSM树在HBase中的应用

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据! 前 ...

  7. 从B+树到LSM树,及LSM树在HBase中的应用

    前言 在有代表性的关系型数据库如MySQL.SQL Server.Oracle中,数据存储与索引的基本结构就是我们耳熟能详的B树和B+树.而在一些主流的NoSQL数据库如HBase.Cassandra ...

  8. B+树 VS LSM树

    目录 B+树 LSM树 比较 总结 B+树 简介:为了改善数据访问特性,文件系统或数据库系统通常会对数据排序后存储,加快数据检索速度.传统关系数据库的做法是使用B+树,保证数据在不断更新.插入.删除后 ...

  9. 最容易理解的LSM树--以示例讲解合并查找过程

    关于LSM树 LSM树,即日志结构合并树(Log-Structured Merge-Tree).其实它并不属于一个具体的数据结构,它更多是一种数据结构的设计思想.大多NoSQL数据库核心思想都是基于L ...

最新文章

  1. unity3d api 中文文档_接口文档系统-showdoc安装部署
  2. shell中(字符串截取)
  3. 如何构建优雅的ViewController
  4. 数据库字段设置为非空默认值
  5. redis生产环境持久化_在SageMaker上安装持久性Julia环境
  6. javafx阴影_JavaFX技巧来节省内存! 属性和可观察对象的阴影场
  7. pycaffe简明文档
  8. 从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory
  9. 2018 年,新手前端是否真的很难找工作?
  10. Power Strings POJ - 2406,字符串hash
  11. win10修改命令行默认字体
  12. 第九届大唐杯省赛知识梳理-5G协议与信令(20%)
  13. 遥感原理与应用总结——第一章:遥感原理的基本概念
  14. 如何开启系统打印机服务器,[两种方法]win7系统的打印机服务如何启动?
  15. python中的reshape是什么意思,Python的reshape的用法
  16. 重新定义“车规级”激光雷达
  17. 如何规划2023高企申报?
  18. 【pyqt5】实现选择文件界面
  19. TDM音频各个时钟频率关系解析
  20. 高新技术企业定义和好处

热门文章

  1. 一起学习下一线大厂的分布式唯一ID生成方案!
  2. Java 离 Linux 内核有多远?
  3. 每日一皮:为什么程序猿是最适合谈恋爱的人
  4. 用好这 12 款 Chrome 扩展,让你的「新标签页」变得好看又实用
  5. Spring Cloud Alibaba 新版本发布:众多期待内容整合打包加入!
  6. Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
  7. python实现tcp通信_Python实现简易TCP通信程序
  8. 查看 Eigen库 linux系统的版本
  9. 结构体转char[]
  10. No Module Named '_pywrap_tensorflow_internal'