首先抛出结论。不管任何存储介质(不论是机械硬盘仍是SSD,抑或是内存)的顺序访问速度都远远高出随机访问的速度。
html
传统数据库,好比Mysql使用的b+树索引,对读友好。但容易形成随机写。好比新插入一个值到数据库,首先咱们要读取b+树,判断新插入的值放在树的什么位置,其次在特定的位置写入新值,并作一系列调整,分裂,使之知足b+树的特性。这不可避免的形成了磁盘的随机访问,大数据量的插入速度很慢。固然这也符合历史发展趋势,早起的IT行业,数据量和数据增加速度有限,只要拥有良好的查询性能,便可知足需求。算法
但随着硬件性能的提高,业务形态的变化,现今的互联网系统,每每面临着数据的大量、高速产生。如何加快存储速度,成了关键。因而LSM Tree应运而生。sql
LSM Tree的最先概念,诞生于1996年google的“BigTable”论文。后世多种数据库产品对LSM Tree的具体实现,都有一些小的差别。采用LSM Tree做为存储结构的数据库有,Google的LevelDB, Facebook的RockDB(RockDB来源于LevelDB), Cassandra,HBase等。数据库
既然顺序写比起随机写速度更快。那得想办法将数据顺序写。缓存
这拥有很高的写速度。可是当咱们想要查寻一个数据的时候,因为存储下的数据自己是无序的(写的值自己没法控制顺序),没法使用任何算法进行优化,只能挨个查询,读取速度是很慢的。数据结构
而请求写入的数据自己是无序且不可预测的,如何保证落盘的数据是有序的呢?这就须要利用内存访问速度比硬盘快的原理。将写入的请求,先在内存中缓存起来,按必定的有序结构组织,达到必定量后,再写入硬盘,从而使得硬盘顺序写入了有序的数据。提升数据的写入速度同时,方便了后续基于有序数据的查找(有序的数据结构,能够经过二分查找等算法进行进行快速查询,具体查找算法,得看是哪一种有序结构)性能
LSM tree即利用了上述第二种方式。具体结构图以下:
大数据
为了防止写入的数据,在断电时丢失。因此先顺序写一份log到硬盘,方便数据恢复。优化
写入数据的内存缓存,MemTable中存储的是有序的数据。什么才是有序的数据结构?不一样的实现可能不相同。LevelDB使用的是SkipList。Hbase使用的是B Tree。google
MemTable中的数据随时在增长,当其增长到必定量后,将其变为不可变数据,ImmutableMemTable。新生成一份MemTable用于后续的数据写入。ImmutableMemTable中的数据,将被写入到硬盘中的SSTable.
SSTable 全称Sorted String Table。实际上就是被写入数据的有序存储文件,因此叫sorted.
SSTable文件有DataBlock,IndexBlock,BitSet(不一样的实现,有可能没有)
数据的有序组织、IndexBlock、BitSet。这些数据结构,都是为了提升数据读取时的速度。那数据是如何进行读取的呢?
读取的大概流程以下
因为SSTable是顺序建立,因此最新的SSTable中包含了最新的值。再查找SSTable时,依次查找最新的SSTable。
每个SSTable的查询流程以下
布隆表达式的原理是以极小的数据容量,去存储大量数据存在的可能性。因此若是经过BitSet的布隆表达式查询该Key存在时,只是一个理论存在可能,接下来要经过IndexBlock真正进行查询。而若是布隆表达式在BitSet中没有找到,那就是真的没有,能够快速跳过,进入下一个SSTable查找。布隆表达式的运用,可以大大提升查找效率。
为了保证数据的顺序写,全部SSTable都不会由于删除和更新而在原数据所在位置进行更改。在更新时,仅仅插入一个最新的值去写到新的SSTable中。在删除时,依然是插入一个基于该Key的删除标记,写入最新的SSTable中。因为查找某个Key是基于时间新鲜度,反向依次查找SSTable,因此读取某个Key始终读的是最新的值。
随着日积月累,SSTable的文件数会增多,致使查找时性能降低。同时因为数据的更新或删除。让老的SSTable中数据的有效性下降,太多的过时数据占用SSTable,一样会下降查询效率。因此通常数据库引擎,按期都会有一个SSTable的合并操做。移除过期数据,将多个小SSTable合并成大的SSTable。
在大内存的条件下,部分数据库还会将最近读取的SSTable 索引,缓存至内存。这进一步加速了查找的过程。
http://www.benstopford.com/2015/02/14/log-structured-merge-trees/
http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html
https://blog.csdn.net/u014774781/article/details/52105708
https://en.wikipedia.org/wiki/Log-structured_merge-tree
https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/
欢迎关注个人我的公众号"西北偏北UP",记录代码人生,行业思考,科技评论