rocksDB被越来越多的作为存储引擎使用,其存储的数据结构LSM-tree使得数据在磁盘上有序存储,相对于B+tree减少了寻道时间,提升查询效率。
1、写入过程
- 数据顺序写入WAL,保证数据不丢。
- 写入memtable,memtable是按key排序的skiplist。写入memtable后返回客户端写入成功。
- memtable写满后(默认32M),转换为immutable memtable。
- 后台线程将immutable memtable刷到磁盘,磁盘数据分层存储,L0层是immutable memtable的存储层所以文件内有序,文件之间key是无序的。
- 上层文件少,下层文件多, 一般下一层是上一层的10倍。上层写满后,数据被merge到下一层,除了L0其他层中各个SST file之间也是有序的。被合并到下一层的数据在上一层被删除。
2、查找过程
- 先在memtable和immtable memtable中查找
- 1中没找到,再到各层中查找,每层中数据是有序的,查找效率高。
- 在内存中缓存key,或者使用bloom filter加速查找过程。
参考文献
- https://github.com/facebook/rocksdb/wiki/RocksDB-Overview
- https://rocksdb.org.cn/doc/Write-Ahead-Log.html