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

其实每一种数据库,它都是一种抽象的数据结构的具体实现。数据库

随着rocksDB(facebook的),levelDB(google的),以及咱们熟知的hbase,他们都是使用的LSM树结构的数据库。缓存

它的核心思路其实很是简单,就是假定内存足够大,所以不须要每次有数据更新就必须将数据写入到磁盘中,而能够先将最新的数据驻留在内存中,等到积累到最后多以后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾(由于全部待排序的树都是有序的,能够经过合并排序的方式快速合并到一块儿)。下图是最简单的二层LSM Tree.数据结构

图来自lsm论文性能

lsm tree,理论上,能够是内存中树的一部分和磁盘中第一层树作merge,对于磁盘中的树直接作update操做有可能会破坏物理block的连续性,可是实际应用中,通常lsm有多层,当磁盘中的小树合并成一个大树的时候,能够从新排好顺序,使得block连续,优化读性能。优化

通常数据库的存储必定要保持有序,有序是一个很是重要的概念(固然hash结构的除外,hash不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操做O(n)快,若是不须要有序的遍历数据,哈希表就是your Mr.Right ).google

LSM树相比于B+树(大量的叶节点操做,不只支持单条记录的增、删、读、改操做,还支持顺序扫描(B+树的叶子节点之间的指针)对B树的写入过程是一次原位写入的过程,主要分为两个部分,首先是查找到对应的块的位置,而后将新数据写入到刚才查找到的数据块中,而后再查找到块所对应的磁盘物理位置,将数据写入去。固然,在内存比较充足的时候,由于B树的一部分能够被缓存在内存中,因此查找块的过程有必定几率能够在内存内完成,不过为了表述清晰,咱们就假定内存很小,只够存一个B树块大小的数据吧。能够看到,在上面的模式中,须要两次随机寻道(一次查找,一次原位写),才可以完成一次数据的写入,代价仍是很高的。 ), 弄了不少个小的有序结构,好比每m个数据,在内存里排序一次,下面100个数据,再排序一次……这样依次作下去,我就能够得到N/m个有序的小的有序结构。 在查询的时候,由于不知道这个数据究竟是在哪里,因此就从最新的一个小的有序结构里作二分查找,找获得就返回,找不到就继续找下一个小有序结构,一直到找到为止。 很容易能够看出,这样的模式,读取的时间复杂度是(N/m)*log2N 。读取效率是会降低的。spa

LSM树原理把一棵大树拆分红N棵小树,它首先写入内存中,随着小树愈来愈大,内存中的小树会flush到磁盘中,磁盘中的树按期能够作merge操做,合并成一棵大树,以优化读性能。指针

总结为,LSM树并非像B+树单次在磁盘寻址,根据索引来进行写入。而是大量堆集内存,达到必定阈值后,写入磁盘,由于是批量处理,磁盘IO对其性能影响很小,对写操做的性能大大提高。而后再磁盘内再进行合并(Merge)操做,再来提高读性能,可见,对于即时读取的性能不高,不可能写进去立刻就读出来,而是要通过一个Merge的过程。blog

相关文章
相关标签/搜索