布隆过滤器
filter是一个布隆过滤器,如果一个key不在memtable中,通过布隆过滤器是可以检查出来的,但是不能验证key存在
filter
memtable_prefix_bloom_bits表示filter占用总的bit数
memtable_prefix_bloom_bits = write_buffer_size * memtable_prefix_bloom_size_ratio * 8
write_buffer_size如果取值128M的话,memtable_prefix_bloom_size_ratio取值0.15,那么memtable_prefix_bloom_bits等于161061273,memtable_prefix_bloom_bits这个还会对齐取整,
实际配置内存大小
\(size=\lfloor{memtable\_prefix\_bloom\_bits}\rfloor/8\)
默认的hash函数是BloomHash,一个key在布隆过滤器散列6次(写死的)。
测试
如果memtable_prefix_bloom_size_ratio>0,插入的成本会增加,需要多插入一次布隆过滤器,查询的时候会先去布隆过滤器读取是否存在。如果不存在就直接return,可能存在再去读memtable。
写入2M个key, key大小是10个字节。
情况 | 开启bloom,使用自带的hash函数 | 开启bloom,使用murmur3 hash函数 | 不开启bloom |
---|---|---|---|
插入耗时 | 2636毫秒 | 3109毫秒 | 2446毫秒 |
查询不存在的key | 2416毫秒 | 823毫秒 | 2229毫秒 |
查询存在的key | 2786毫秒 | 3261毫秒 | 2601毫秒 |
结论
自带的bloomhash速度比murmur3 hash快,但是散列非常不均衡,murmur3 hash key冲突的概率 < 1%
开启bloom,使用自带的hash函数效果不如不开启
使用murmur3 hash函数,查找不存在的key速度比不开启快,插入和查找存在的key速度比不开启慢