这一节介绍数据库存储引擎常用的两种数据结构。作为关系型数据库的代表,MySql的InnoDB使用B+树来存储索引。作为NoSQL的代表,HBase使用的LSM树,我们来看看两者有什么区别。

B+树

B+树是大学数据结构里的内容。要了解什么是B+树,先从简单的开始。

二叉排序树

简单的说,二叉排序树首先是一个二叉树,每个结点最多只有两个分支,每个结点存储一个数据。左子树的所有结点都比父结点小(或相等),右子树的所有结点都比父结点大(或相等)。两个括号里的“或相等”附加说明,只能存在一个。

上面这两个图片都是二叉排序树。第一个树是平衡二叉树(任意结点左右子树高度差小于等于1,AVL),第二个树不平衡。不平衡会导致数据查询效率下降,因此要避免数据倾斜。

B树

二叉树的结点能保存数据,但是它存在缺点,如果数据量很大,它的深度会很大,查询效率低。比如:20层的满二叉树也只能存储100多万条数据。对于动辄数百万条记录的关系型数据库来说,要是查找一条记录如果要发生十几次IO,这个延时是不能接受的。

平衡树(B树,Balance Tree)是一种平衡多叉树,结点之间和结点内部也是有序的,每个结点有多个子结点,每个结点可以存储多个数据。二叉树因为瘦高,查询效率低。B树因为矮胖,降低了树的深度,查询效率快很多。具体定义自行百度。

B+树

B+树是B树的一个变形,B+树的非叶子结点不存储数据,只作为索引。B+树的叶子结点内部,数据是有序排列的。

B+树的叶子结点兄弟之间有从左至右的指针,方便范围查询。

LSM

Log-Structured Merge-Tree,日志结构合并树,强调三点:一是这不是一个具体的数据结构只是一种做法,二是像写日志那样只追加,三是树会合并。

LSM为KV存储系统量身定做,只追加不修改不删除的特性很好地利用了机械硬盘顺序写入快、随机写入慢的特性。LSM首先是写内存,在内存中是一颗小树,内存要足够大,这比直接写磁盘也快了十万倍。内存写满了再落盘,追加到尾部,并且对大量的小文件做合并操作形成大树。为了将随机写转换为顺序写,LSM存储了大量的重复过时数据,这是空间换时间的做法。

上面这一点对于大量的写操作是非常高效的,但是读性能会略微受影响。读取数据的时候由于没有一颗完整有序的大树,所以要从最新的小树里查找数据,找不到的话就往前找。当然,这个缺陷可以使用布隆过滤器来优化。

我看了很多资料,都提到LSM是基于机械硬盘磁臂移动慢出现的,那么换成SSD还有这问题吗?老外对这个问题已经有研究了,看这里Separating Keys from Values in SSD-conscious Storage

当机械硬盘退出生产环境舞台的时候,LSM也许会迎来一波变革吧。

大数据学习(15)—— B+树和LSM的更多相关文章

  1. 大数据学习之BigData常用算法和数据结构

    大数据学习之BigData常用算法和数据结构 1.Bloom Filter     由一个很长的二进制向量和一系列hash函数组成     优点:可以减少IO操作,省空间     缺点:不支持删除,有 ...

  2. 大数据学习(16)—— HBase环境搭建和基本操作

    部署规划 HBase全称叫Hadoop Database,它的数据存储在HDFS上.我们的实验环境依然基于上个主题Hive的配置,参考大数据学习(11)-- Hive元数据服务模式搭建. 在此基础上, ...

  3. 大数据学习之 LINUX

    ##大数据学习 古斌6.6 01. linux系统的搭建: 选用 Contos 6.5 x64位系统 (CentOS-6.5-x86_64-minimal.iso) 我选择的为迷你版 模板机: bla ...

  4. 大数据学习day26----hive01----1hive的简介 2 hive的安装(hive的两种连接方式,后台启动,标准输出,错误输出)3. 数据库的基本操作 4. 建表(内部表和外部表的创建以及应用场景,数据导入,学生、分数sql练习)5.分区表 6加载数据的方式

    1. hive的简介(具体见文档) Hive是分析处理结构化数据的工具   本质:将hive sql转化成MapReduce程序或者spark程序 Hive处理的数据一般存储在HDFS上,其分析数据底 ...

  5. 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)

    引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...

  6. 大数据学习系列之五 ----- Hive整合HBase图文详解

    引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...

  7. 大数据学习系列之六 ----- Hadoop+Spark环境搭建

    引言 在上一篇中 大数据学习系列之五 ----- Hive整合HBase图文详解 : http://www.panchengming.com/2017/12/18/pancm62/ 中使用Hive整合 ...

  8. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  9. 大数据学习系列之九---- Hive整合Spark和HBase以及相关测试

    前言 在之前的大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 中介绍了集群的环境搭建,但是在使用hive进行数据查询的时候会非常的慢,因为h ...

  10. 大数据学习之Linux进阶02

    大数据学习之Linux进阶 1-> 配置IP 1)修改配置文件 vi /sysconfig/network-scripts/ifcfg-eno16777736 2)注释掉dhcp #BOOTPR ...

随机推荐

  1. Go语言Slice作为函数参数详解

    Go语言Slice作为函数参数详解 前言 首先要明确Go语言中实质只有值传递,引用传递和指针传递是相对于参数类型来说. 个人认为上诉的结论不对,把引用类型看做对指针的封装,一般封装为结构体,结构体是值 ...

  2. Linux-Jumpserver服务

    1.介绍 Jumpserver是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. 特点: 完全开源,GPL授权 Python编 ...

  3. 13 Nginx访问日志分析

    #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # Nginx 日志格式: # ...

  4. ECS实例中的应用偶尔出现丢包现象并且内核日志(dmesg)存在“kernel: nf_conntrack: table full, dropping packet”的报错信息

    问题描述 连接ECS实例中的应用时偶尔出现丢包现象.经排查,ECS实例的外围网络正常,但内核日志(dmesg)中存在"kernel: nf_conntrack: table full, dr ...

  5. Docker搭建Jenkins+Maven/Gradle——代码自动化运维部署平台(二)

    一.简介 1.Jenkins 概述: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins ...

  6. AcWing 237. 程序自动分析

    #include<bits/stdc++.h> using namespace std; const int N=1e6+5; int f[N*2],a[N],b[N],c[N],n,t, ...

  7. salesforce零基础学习(一百零五)Change Data Capture

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...

  8. Python 脚本退出

    return:在定义函数时从函数中返回一个函数的返回值,终止函数的执行. os._exit(),sys.exit(),exit(),quit()都能够退出当前执行脚本,差别在于os._exit()直接 ...

  9. 在docker的镜像中安装vim

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim,可是当你敲apt-get install vim命令时 ...

  10. Linux文件目录结构详解 (转)

      整理自<鸟哥的私房菜> 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能, ...