# RocksDB 查询

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

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

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

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
























