# RocksDB 查询

__*RocksDB 查询*__
__*RocksDB 读*__
__*隆过滤器*__
__*Bloom Filter*__
__*Block Cache*__

![left](./student-guide/diagram/RocksDBQuery_aa_001_20220511.png)
-------------------------------------------------------------
数据存储在 RocksDB 中,那么数据的查询也需要通过 RocskDB 来完成,下面让我们先了解下 RocksDB 的查询操作,查询操作相较于 B+ 树就比较慢了,查询操作需要依次读取 MemTable、immutable MemTable、SSTable0、SSTable1......。需要反序地遍历所有的集合,又因为写入顺序和合并顺序的缘故,序号小的集合中的数据一定会比序号大的集合中的数据新。所以在这个反序遍历的过程中一旦匹配到了要读取的数据,那么一定是最新的数据,只要返回该数据即可。但是如果一个数据的确不在所有的数据集合中,则会白白地遍历一遍。

这么看来读操作还是比较笨拙,RocksDB 通过 Bloom Filter 来加速读操作。当 Bloom Filter 判断出相应的 SSTable 中没有要读取的数据时,就跳过该 SSTable。

注:Bloom Filter 实际上是一个很长的二进制向量和一系列随机映射函数。Bloom Filter 可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率。说得通俗易懂一点,就是:布隆过滤器判定在这个集合的元素,不一定真的在集合中,但是 Bloom Filter 判定不在的,就一定不在。

最后,RocksDB 内部还有一个 Block Cache 功能,我们可以设置内存中的一个空间给 Block Cache ,这个 Block Cache 中是我们经常访问的数据,所以查询操作会优先选择从 Block Cache 中读取数据,如果数据没有被缓存到 Block Cache 中,那么我们就开始从 MemTable 中启动上面叙述的读取流程。























