点击上方蓝色字体,选择“设为星标

回复”资源“获取更多资源

大数据技术与架构点击右侧关注,大数据开发领域最强公众号!

暴走大数据点击右侧关注,暴走大数据!

前言

在有代表性的关系型数据库如MySQL、SQL Server、Oracle中,数据存储与索引的基本结构就是我们耳熟能详的B树和B+树。而在一些主流的NoSQL数据库如HBase、Cassandra、LevelDB、RocksDB中,则是使用日志结构合并树(Log-structured Merge Tree,LSM Tree)来组织数据。本文先由B+树来引出对LSM树的介绍,然后说明HBase中是如何运用LSM树的。

回顾B+树

为什么在RDBMS中我们需要B+树(或者广义地说,索引)?一句话:减少寻道时间。在存储系统中广泛使用的HDD是磁性介质+机械旋转的,这就使得其顺序访问较快而随机访问较慢。使用B+树组织数据可以较好地利用HDD的这种特点,其本质是多路平衡查找树。下图是一棵高度为3的4路B+树示例。

与普通B树相比,B+树的非叶子节点只有索引,所有数据都位于叶子节点,并且叶子节点上的数据会形成有序链表。B+树的主要优点如下:

  • 结构比较扁平,高度低(一般不超过4层),随机寻道次数少;

  • 数据存储密度大,且都位于叶子节点,查询稳定,遍历方便;

  • 叶子节点形成有序链表,范围查询转化为顺序读,效率高。相对而言B树必须通过中序遍历才能支持范围查询。

当然,B+树也不是十全十美的,它的主要缺点有两个:

  • 如果写入的数据比较离散,那么寻找写入位置时,子节点有很大可能性不会在内存中,最终会产生大量的随机写,性能下降。下图来自TokuDB的PPT,说明了这一点。

  • 如果B+树已经运行了很长时间,写入了很多数据,随着叶子节点分裂,其对应的块会不再顺序存储,而变得分散。这时执行范围查询也会变成随机读,效率降低了。

可见,B+树在多读少写(相对而言)的情境下比较有优势,在多写少读的情境下就不是很有威力了。当然,我们可以用SSD来获得成倍提升的读写速率,但成本同样高昂,对海量存储集群而言不太可行。日志结构合并树(LSM Tree)就是作为B+树的替代方案产生的。认识LSM树LSM树由Patrick O'Neil等人在论文《The Log-Structured Merge Tree》中提出,它实际上不是一棵树,而是2个或者多个树或类似树的结构(注意这点)的集合。下图示出最简单的有2个结构的LSM树。在LSM树中,最低一级也是最小的C0树位于内存里,而更高级的C1、C2...树都位于磁盘里。数据会先写入内存中的C0树,当它的大小达到一定阈值之后,C0树中的全部或部分数据就会刷入磁盘中的C1树,如下图所示。由于内存的读写速率都比外存要快非常多,因此数据写入C0树的效率很高。并且数据从内存刷入磁盘时是预排序的,也就是说,LSM树将原本的随机写操作转化成了顺序写操作,写性能大幅提升。不过,它的tradeoff就是牺牲了一部分读性能,因为读取时需要将内存中的数据和磁盘中的数据合并。总体上来讲这种tradeoff还是值得的,因为:

  • 可以先读取内存中C0树的缓存数据。内存的效率很高,并且根据局部性原理,最近写入的数据命中率也高。

  • 写入数据未刷到磁盘时不会占用磁盘的I/O,不会与读取竞争。读取操作就能取得更长的磁盘时间,变相地弥补了读性能差距。

在实际应用中,为了防止内存因断电等原因丢失数据,写入内存的数据同时会顺序在磁盘上写日志,类似于我们常见的预写日志(WAL),这就是LSM这个词中Log一词的来历。另外,如果有多级树的话,低级的树在达到大小阈值后也会在磁盘中进行合并,如下图所示。下面以HBase为例来简要讲解LSM树是如何发挥其作用的。HBase中的LSM树我们已经了解了HBase的读写流程与MemStore的作用。MemStore作为列族级别的写入和读取缓存,它就是HBase中LSM树的C0层。并且它确实也没有采用树形结构来存储,而是采用了跳表——一种替代自平衡BST的结构。MemStore Flush的过程,也就是LSM树中C0层刷写到C1层的过程,而LSM中的日志对应到HBase自然就是HLog了。为了方便理解,再次祭出之前用过的HBase读写流程简图。HFile就是LSM树中的高层实现。从逻辑上来讲,它是一棵满的3层B+树,从上到下的3层索引分别是Root index block、Intermediate index block和Leaf index block,对应到下面的Data block就是HFile的KeyValue结构了。HFile V2索引结构的图示如下:我们已经知道,HFile过多会影响读写性能,因此高层LSM树的合并即对应HFile的合并(Compaction)操作。合并操作又分别Minor和Major Compaction,由于Major Compaction涉及整个Region,对磁盘压力很大,因此要尽量避免。HBase为了提升LSM结构下的随机读性能,还引入了布隆过滤器(建表语句中可以指定),对应HFile中的Bloom index block,其结构图如下所示。通过布隆过滤器,HBase就能以少量的空间代价,换来在读取数据时非常快速地确定是否存在某条数据,效率进一步提升。欢迎点赞+收藏+转发朋友圈素质三连

文章不错?点个【在看】吧! ?

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

  1. 3层b+树索引访问磁盘次数_【112期】面试官:为什么选择B+树作为数据库索引结构?谈谈你的理解

    本文同步Java知音社区,专注于Java 阶段汇总集合:++小Flag实现,一百期面试题汇总++ 背景 首先,来谈谈B树.为什么要使用B树?我们需要明白以下两个事实: [事实1] 不同容量的存储器,访 ...

  2. 3层b+树索引访问磁盘次数_深入理解MySQL索引底层实现原理丨技术干货

    一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...

  3. java访问本地文件_详解Java读取本地文件并显示在JSP文件中

    详解Java读取本地文件并显示在JSP文件中 当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相 ...

  4. python编写一个程序、计算字符串中子串出现的次数_急求。。。C语言实现,计算字符串中子串出现的次数,就是先输入一个字符串,再输入一个上面字符串中存在...

    展开全部 #include #include void main() { char str1[20], str2[20], *p1, *p2; int sum=0; printf("Plea ...

  5. mysql -b -e_MySQL 的B+树索引.

    一.B+树索引概述 索引是应用程序设计和开发的一个重要方面.若索引太多,应用程序的性能可能会受到影响(需维护索引的结构和数据):而索引太少,对查询性能又会产生影响. 二叉树,左子树的键值总是小于根的键 ...

  6. null索引表键值_MySQL 的B+树索引

    一.B+树索引概述 索引是应用程序设计和开发的一个重要方面.若索引太多,应用程序的性能可能会受到影响(需维护索引的结构和数据):而索引太少,对查询性能又会产生影响. 二叉树,左子树的键值总是小于根的键 ...

  7. Mysql B+树索引

    原文地址:https://amos-x.com/index.php/amos/archives/mysql-btree-index/ 前言 索引是数据库提高查询效率的常用办法,那么索引为什么能提高查询 ...

  8. Mysql InnoDB B+树索引和哈希索引的区别? MongoDB 为什么使用B-树?

    B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. B+树 B+树是为磁盘及其他存储辅助设备而设计一种平衡查找树(不是二叉树).B+ ...

  9. 快速查询的秘籍 —— B+ 树索引

    B+树索引 标签: MySQL是怎样运行的 前边我们详细唠叨了InnoDB数据页的7个组成部分,知道了各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每 ...

最新文章

  1. 触摸矫正+android,android触摸矫正解方程
  2. IOS初级:NSKeyedArchiver
  3. python有道翻译-使用python2爬取有道翻译
  4. yum源 php7.2,云服务器:CentOS7 yum安装PHP7.2的操作方法
  5. 利用位运算解决 N 皇后问题
  6. 作者:陈兴鹏(1963-),男,兰州大学资源环境学院教授、博士生导师。
  7. 记住这两点,彻底终结原型链吧
  8. 扫雷游戏网页版_佛性扫雷 炸不炸随缘
  9. 外链检测工具,反链友链检测工具
  10. VS2015安装教程详细步骤及配置Opencv4.1.1(亲测)
  11. Photoshop2018安装
  12. 在Windows 10下提取/读取 Linux img 镜像文件
  13. 一个简单的CD唱片管理程序
  14. 认认真真推荐几个优质公众号
  15. 网络存储技术Windows server 2012 (项目二 动态磁盘的配置与管理)
  16. linux debian u盘安装,Debian U盘安装盘,debian安装盘
  17. 《LeetCode零基础指南》导读
  18. sync.Map详解
  19. SecoClient 警告:当前服务进程已退出或关闭,请尝试重新安装客户端!
  20. php cgi.exe在哪里,php-cgi.exe

热门文章

  1. SQL存储过程:取出自定义条数的数据
  2. 安装Ubuntu时的硬盘分区方案
  3. fjblog佛教博客不错
  4. 关于table的用法(二)
  5. npm install readline-sync:同步获取用户通过键盘输入的值(+算法实例)
  6. JavaScript(七)—— BOM 浏览器对象模型
  7. 读书笔记--《Understanding LSTM Networks》
  8. ssr Android简书,react服务端渲染ssr
  9. 学生信息管理---C#文件写入及读取
  10. 如何在PHP里面连接数据库?