# `RocksDB` 查询

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

![`smart`](RocksDBQuery_aa_001_20220511.png)
-------------------------------------------------------------
数据存储在 `RocksDB` 中,那么数据的查询也需要通过 `RocskDB` 来完成,下面让我们先了解下 `RocksDB` 的查询操作,查询操作相较于 `B+ Tree` 就比较慢了,查询操作需要依次读取 `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` 中启动上面叙述的读取流程。























