Bloom Filter 在存储引擎中的应用
LSM Tree 的读取需要检查多层,最坏情况要遍历所有 SSTable。有没有办法快速判断某个 key 一定不存在?
Bloom Filter(布隆过滤器)就是这个问题的答案。
Bloom Filter 原理
Bloom Filter 用一个位数组和多个哈希函数,快速判断一个元素是否可能存在。
核心思想
工作原理图示
误判率
Bloom Filter 不会漏报(不存在的元素一定报告不存在),但会误报(存在的元素可能报告存在)。
误判率公式
最优哈希函数数量
常用参数配置
Bloom Filter 在 SSTable 中的应用
SSTable 的每个文件都附带一个 Bloom Filter:
读取流程优化
性能提升
没有 Bloom Filter 时:
有 Bloom Filter 时:
计数布隆过滤器
标准 Bloom Filter 不能删除元素。Counting Bloom Filter 用计数器数组代替位数组,支持删除。
代价
- 空间增加(int vs bit)
- 有上限(计数器溢出风险)
Cuckoo Filter
Cuckoo Filter 是 Bloom Filter 的替代方案,支持删除且空间效率更高。
Cuckoo Filter 原理
Cuckoo vs Bloom
布隆过滤器的应用场景
数据库索引
- MySQL InnoDB:每个 Page 一个 Bloom Filter
- RocksDB:每个 SSTable 一个 Bloom Filter
- Cassandra:每个 SSTable 一个 Bloom Filter
缓存穿透防护
去重判断
最佳实践:Bloom Filter 的误判率取决于空间配置。在 RocksDB 中,默认每个 key 使用 10 位,空间约为数据大小的 1/8。如果空间不足,误判率会上升,读取性能下降。