leveldb为什么这么快

原创 2015年07月09日 14:23:48

nosql数据库大多采用leveldb或者类似leveldb的存储引擎,我们来看看它为什么能够这么快。

levelDB则采用了一种全新的数据结构,叫做log structured merge tree(LSMT),写入数据时,一方面会把数据保存到内存,另一方面写入到日志,防止down机导致数据丢失。内存中的数据是排好序的,当内存中的数据达到一定阈值时,把内存中的数据保存到磁盘,并且把第一次写出的文件放到level 0。当level0的数据文件数量较多时,就对所有的level0和level1(初始为空)的数据进行一次归并排序并把结果放在level1。当level1的文件较多,每次合并level0和level1就会涉及大量的文件,因此会合并level1和level2的文件,结果放在level2,levelDB中,level n的数据量是level n-1的10倍。

进行写操作时,传统数据库使用索引,需要维护索引会产生较多的随机写。而leveldb则是写日志,把内存数据写出,归并文件,全部是顺序写,因此特别适合传统磁盘。

进行读操作室,传统数据库需要在索引中从根节点找到叶节点,产生较多的随机读。而leveldb则是从已经排好序的文件中读取数据,虽然需要读取每一层,因为层内的数据是排好序的,而层之间则没有排序关系。level 0特殊处理,该层中,每个文件内部排好序,不同文件没有序列关系,因此需要读取该层所有文件。那么一次读取就需要读取多个文件(一般是7-10个文件)才能够获取到数据。这时bloom filter派上了大用场,它为每条记录的key在内存中保持几个比特,通过这些数据,如果一个key不在文件中,leveldb能够快速判断出来。这样,虽然一次读取会变成多个读取,但这些读取因为bloom filter又缩减为接近一个磁盘读取。

上面的分析可以看出,传统数据库在存取数据时需要多个IO操作,而levelDB通过对数据进行排序,摆脱了对索引的依赖;通过顺序写,可以达到一个写保存多条数据的效果;通过bloom filter达到一次读只需一个IO操作的目标。



每天进步一点点——leveldb项目实践

leveldb是Google公司开源的高性能Key-Value数据库,在很多开源的项目中就有使用,例如:Chromium,淘宝的Tair,SSDB等。leveldb对于小数据在写入百万个之后读写性能依...
  • cywosp
  • cywosp
  • 2014年03月08日 00:48
  • 18137

LevelDB详解

LevelDB   一、LevelDB入门 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,Level...

c/c++ 之指针的指针总结

1.指向整形数的指针指针变量p的值是001BFD18,而*号的作用是取值,*p即取地址001BFD18中存放的值2.指向字符型指针其实p中存放的是地址,只是当cout时,如果指针是字符型指针,那么会输...

c 语言之fork() 函数用法

fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:1)在父进程中,fork返回新创建子进程的进程ID; 2)在子进程中,fork返回0; 3)如果出现错误,fo...

LevelDB.Net.x64

  • 2017年12月06日 11:19
  • 208KB
  • 下载

leveldb源码

  • 2017年10月31日 18:51
  • 452KB
  • 下载

leveldb之Compaction操作下之具体实现

由上文可知,合并主要分为三种: 1)对Memtable进行合并 2)trivial Compaction,直接将文件移动到下一层 3)一般的合并,调用DoCompactionWork()实现 ...

mnist数据集(leveldb和lmdb格式)

  • 2016年10月24日 09:04
  • 23.93MB
  • 下载

LevelDB原理探究与代码分析

1. 概述 Level DB(http://code.google.com/p/leveldb/)是google开源的Key/Value存储系统,它的committer阵容相当强大,基本上是bigt...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leveldb为什么这么快
举报原因:
原因补充:

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