LSM-tree 一种高效的索引数据结构

转载 2016年05月30日 20:48:31

 

论文 The Log-Structure Merge-Tree(LSM-tree)(http://www.google.com.my/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&ved=0CDoQFjAD&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.44.2782%26rep%3Drep1%26type%3Dpdf&ei=6OlPUJuZFsaYiAfIkIHIDg&usg=AFQjCNGGoN9IFTLShcv2HbL0RVQdElfxow&sig2=8wysS63qlqRvWf5m3lk7bg) 描述了这种数据结构的目标和算法细节。

 

LSM-tree主要目标是快速地建立索引。B-tree是建立索引的通用技术,但是,在大并发插入数据的情况下,B-tree需要大量的磁盘随机IO,很显然,大量的磁盘随机IO会严重影响索引建立的速度。特别地,对于那些索引数据大的情况(例如,两个列的联合索引),插入速度是对性能影响的重要指标,而读取相对来说就比较少。LSM-tree通过磁盘的顺序写,来达到最优的写性能,因为这会大大降低磁盘的寻道次数,一次磁盘IO可以写入多个索引块。

 

LSM-tree的主要思想是划分不同等级的树。以两级树为例,可以想象一份索引数据由两个树组成,一棵树存在于内存,一棵树存在于磁盘。内存中的树可以不一定是B-树,可以是其他的树,例如AVL树。因为数据大小是不同的,没必要牺牲CPU来达到最小的树高度。而存在于磁盘的树是一棵B-树。

 

 

数据首先会插入到内存中的树。当内存中的树中的数据超过一定阈值时,会进行合并操作。合并操作会从左至右遍历内存中的树的叶子节点与磁盘中的树的叶子节点进行合并,当被合并的数据量达到磁盘的存储页的大小时,会将合并后的数据持久化到磁盘,同时更新父亲节点对叶子节点的指针。

 

 

之前存在于磁盘的叶子节点被合并后,旧的数据并不会被删除,这些数据会拷贝一份和内存中的数据一起顺序写到磁盘。这会操作一些空间的浪费,但是,LSM-tree提供了一些机制来回收这些空间。

 

磁盘中的树的非叶子节点数据也被缓存在内存中。

 

数据查找会首先查找内存中树,如果没有查到结果,会转而查找磁盘中的树。

 

有一个很显然的问题是,如果数据量过于庞大,磁盘中的树相应地也会很大,导致的后果是合并的速度会变慢。一个解决方法是建立各个层次的树,低层次的树都比上一层次的树数据集大。假设内存中的树为c0, 磁盘中的树按照层次一次为c1, c2, c3, ... ck-1, ck。合并的顺序是(c0, c1), (c1, c2)...(ck-1, ck)。

 

为什么LSM-tree的插入很快

 

1. 首先,插入操作首先会作用于内存,并且,内存中的树不会很大,这会很快。

2. 合并操作会顺序写入一个或多个磁盘页,这比随机写快得多。

 

转自:http://bofang.iteye.com/blog/1676698

 

LSM-tree 一种高效的索引数据结构

转自: 论文 The Log-Structure Merge-Tree(LSM-tree)(http://www.google.com.my/url?sa=t&rct=j&q=&esrc=s&s...
  • guo_net
  • guo_net
  • 2014年11月12日 10:59
  • 555

高效的数据结构和经典算法

1 Bloom filter 2 跳跃表 3 trie树 未完待遇,LZ会在随后将这些问题补上。
  • china1000
  • china1000
  • 2013年10月18日 11:24
  • 2510

LSM树(Log-Structured Merge Tree)存储引擎

LSM树(Log-Structured Merge Tree)存储引擎 代表数据库:nessDB、leveldb、hbase等 核心思想的核心就是放弃部分读能力,换取写入的最大化能力。LS...
  • u014774781
  • u014774781
  • 2016年08月03日 17:29
  • 5554

Android性能优化(一)——数据结构优化

数据结构优化,使用Sparsearray 替换HashMap 资料: Android应用性能优化之使用SparseArray替代HashMap Android中的稀疏数组:SparseArray...
  • watermusicyes
  • watermusicyes
  • 2015年05月19日 07:39
  • 1894

数据库索引中包含的数据结构有哪些

1 索引介绍   MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。   我们知道,数据库查询是数据库的最...
  • FX677588
  • FX677588
  • 2017年08月06日 18:20
  • 964

MySQL索引数据结构及算法原理学习笔记

学习参考:https://www.kancloud.cn/kancloud/theory-of-mysql-index/418521、预备知识 (1)存储介质一般为主存和磁盘 (2)主存(RAM)...
  • liupeng_qwert
  • liupeng_qwert
  • 2017年08月14日 23:21
  • 311

数据库索引文件一般采用什么数据结构?

数据库索引文件一般采用什么数据结构? 什么是主键索引?主键索引的数据结构? 什么是非主键索引?非主键索引的数据结构? 数据库索引文件一般采用什么数据结构?为什么创建非主键索引会降低更新速度,提高...
  • u010523770
  • u010523770
  • 2017年03月18日 11:48
  • 1071

如何创建高效的索引

要让创建的索引真正有效,是需要一个过程的,不是系统上线之前调一下就行了,而是需要在系统运行过程中,不断调整。 (1)考虑索引本身的特性 在前面的文章中,已经说了,索引的3个特性:有序、索引...
  • yupeigu
  • yupeigu
  • 2018年01月23日 13:18
  • 82

从零开始_学_数据结构(四)——查找算法、索引、二叉排序树

查找算法   基本概念: (1)关键字:假如有结构 struct Node //一个结点,存储数据和指针 { DATA data; //数据属性,用于存储数据 int key; ...
  • qq20004604
  • qq20004604
  • 2016年03月25日 16:47
  • 1423

高效的索引

如何建立理想的索引? 查询频繁度 区分度 索引长度 覆盖字段 区分度假设100万用户,性别基本上男/女各为50W, 区分度就低。长度小索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速...
  • baochao95
  • baochao95
  • 2017年03月15日 10:49
  • 606
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LSM-tree 一种高效的索引数据结构
举报原因:
原因补充:

(最多只允许输入30个字)