MySQL · myrocks · myrocks之Bloom filter

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

Bloom filter 简介

Bloom filter用于判断一个元素是不是在一个集合里,当一个元素被加入集合时,通过k个散列函数将这个元素映射成一个位数组中的k个点,把它们置为1。检索时如果这些点有任何一个为0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。 优点:布隆过滤器存储空间和插入/查询时间都是常数O(k)。 缺点:有一定的误算率,同时标准的Bloom Filter不支持删除操作。 Bloom Filter通过极少的错误换取了存储空间的极大节省。

bloom filter

设集合元素个数为n,数组大小为m, 散列函数个数为k

有一个规律是当 k=m/n*ln2 时,误算率最低。参考Bloom_filter wiki

rocksdb与bloom filter

rocksdb中memtable和SST file都属于集合类数据且不需要删除数据,比较适合于Bloom filter.

rocksdb memtable和SST file都支持bloom filter, memtable 的bloom filter数组就存储在内存中,而SST file的bloom filter持久化在bloom filter中.

  • SST Bloom filter
SST Boomfilter 在Flush生成SST files时通过计算产生,分为两个阶段
  1. 将prefix_extrator指定的key前缀加入到HASH表hash_entries_中
  2. 将hash_entries_所有映射到Bloom filter的数组中

SST Bloom filter相关参数有

filter_policy=bloomfilter:10:false; whole_key_filtering=0 prefix_extractor=capped:24 partition_filters=false 

其中prefix_extractor=capped:24, 表示最多取前缀24个字节,另外还有fixed:n方式表示只取前缀n个字节,忽略小于n个字节的key. 具体可参考CappedPrefixTransform,FixedPrefixTransform

filter_policy=bloomfilter:10:false;其中bits_per_key_=10, bits_per_key_实际就是前面公式k=m/n*ln2 中的m/n. 从而如下计算k即num_probes_的方式

void initialize() {
 // We intentionally round down to reduce probing cost a little bit
 num_probes_ = static_cast<size_t>(bits_per_key_ * 0.69); // 0.69 =~ ln(2) if (num_probes_ < 1) num_probes_ = 1;
 if (num_probes_ > 30) num_probes_ = 30;
 }

use_block_based_builder_表示是使用block base filter还是full filter partition_filters 表示时否使用partitioned filter,SST数据有序排列,按block_size进行分区后再产生filter,index_on_filter block存储分区范围. 开启partition_filters 需配置index_type =kTwoLevelIndexSearch

filter 参数优先级如下 block base > partitioned > full. 比如说同时指定use_block_based_builder_=true和partition_filters=true实际使用的block based filter

whole_key_filtering,取值true, 表示增加全key的filter. 它和前缀filter并不冲突可以共存。

rocksdb 内部 bloom filter实现方式有三种

block based filter,SST file每2kb作为一个block构建bloom filter信息。
full filter. 整个SST file构建一个bloom filter信息。

partitioned filter, 将SST filter按block_size将进行分区, 每个分区构建bloom filter信息。分区是有序的,有最大值和最小值,从而在分区之上构建索引存储在SST block中。

屏幕快照 2017-08-31 上午10.46.09.png

  • memtable Bloom filter
  • memtable 在每次Add数据时都会更新Bloom filter.
  • Bloom filter提供参数memtable_prefix_bloom_size_ratio,其值不超过0.25, Bloom filter数组大小为write_buffer_size* memtable_prefix_bloom_size_ratio.
  • memtable Bloom filter 中的num_probes_取值硬编码为6

另外参数cache_index_and_filter_blocks可以让filter信息缓存在block cache中。

MyRocks和bloom filter

在myrocks中,Bloom filter是全局的,设置了Bloom filter后,所有表都有Bloom filter。Bloom filter和索引是绑定在一起的。也就是说,表在查询过程中,如果可以用到某个索引,且设置了Bloom filter,那么就有可能会用到索引的Bloom filter.

MyRocks可以使用Bloom filter的条件如下,详见函数can_use_bloom_filter

  • 必须是索引前缀或索引全列的等值查询
  • 等值前缀的长度应该符合prefix_extrator的约定

我们可以通过以下两个status变量来观察Bloom filter使用情况 rocksdb_bloom_filter_prefix_checked:是否使用了Bloom filter rocksdb_bloom_filter_prefix_useful:使用Bloom filter判断出不存在 rocksdb_bloom_filter_useful:BlockBasedTable::Get接口使用Bloom filter判断出不存在

设置参数rocksdb_skip_bloom_filter_on_read可以让查询不使用Bloom filter。

示例

最后给个示例 参数设置如下,使用partitioned filter

rocksdb_default_cf_options=write_buffer_size=64k;
block_based_table_factory={filter_policy=bloomfilter:10:false;whole_key_filtering=0;
partition_filters=true;index_type=kTwoLevelIndexSearch};prefix_extractor=capped:24 

SQL

CREATE TABLE t1 (id1 INT, id2 VARCHAR(100), id3 BIGINT, value INT, PRIMARY KEY (id1, id2, id3)) ENGINE=rocksdb collate latin1_bin;
let $i = 1;
while ($i <= 10000) {
 let $insert = INSERT INTO t1 VALUES($i, $i, $i, $i);
 inc $i;
 eval $insert;
}

## case 1: 等值条件prefix长度 < 24, 用不Bbloom filter select variable_value 
into @c from information_schema.global_status where variable_name='rocksdb_bloom_filter_prefix_checked';
select variable_value into @u from information_schema.global_status where variable_name='rocksdb_bloom_filter_prefix_useful';
select count(*) from t1 WHERE id1=100 and id2 ='10';
count(*)
0 select (variable_value-@c) > 0 from information_schema.global_status where variable_name='rocksdb_bloom_filter_prefix_checked';
(variable_value-@c) > 0 0 select (variable_value-@u) > 0 from information_schema.global_status 
where variable_name='rocksdb_bloom_filter_prefix_useful';
(variable_value-@u) > 0 0 # case 2: 符合使用Bbloom filter的条件,且成功判断出不存在 
select variable_value into @c from information_schema.global_status where variable_name='rocksdb_bloom_filter_prefix_checked';
select variable_value into @u from information_schema.global_status where variable_name='rocksdb_bloom_filter_prefix_useful';
select count(*) from t1 WHERE id1=100 and id2 ='00000000000000000000';
count(*)
0 select (variable_value-@c) > 0 from information_schema.global_status where variable_name='rocksdb_bloom_filter_prefix_checked';
(variable_value-@c) > 0 1 select (variable_value-@u) > 0 from information_schema.global_status where variable_name='rocksdb_bloom_filter_prefix_useful';
(variable_value-@u) > 0 1

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
前端开发 JavaScript Java
整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶
​ 本篇文章结构大体还是和上篇文章 Mybatis+Servlet+Mysql 整合的一个小项目一致,但增加了axios、Filter、session。在数据库层面涉及到了增、查、改,一个代码量不算多的小项目,但十分有助于初学者的学习。​ 博主在编写项目的同时,发现自己对Axios、Filter的理解并不好,通过本项目,打扎实了自己的基础。​ 开发此小项目之前,我对同学说,我异步请求用的很少,殊不知自己一直在用异步请求,反而同步请求用的很少很少了。​ 在编写项目之时,被axios post传参困扰了很久很久
整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶
|
SQL 分布式计算 并行计算
PostgreSQL 并行计算解说 之2 - parallel filter
标签 PostgreSQL , cpu 并行 , smp 并行 , 并行计算 , gpu 并行 , 并行过程支持 背景 PostgreSQL 11 优化器已经支持了非常多场合的并行。简单估计,已支持27余种场景的并行计算。 parallel seq scan parallel index scan parallel index only sc
269 0
|
Web App开发 关系型数据库 C语言
PostgreSQL bloom filter index 扩展 for bigint
标签 PostgreSQL , bloom filter , bloom filter index 背景 凡是支持HASH函数,以及相等operator的类型,都可以使用bloom filter index . 扩展方法见本文。
1157 0
|
关系型数据库 C语言 索引
|
存储 关系型数据库 MySQL
基于 Percona Server for MySQL 体验 MyRocks
RocksDB是facebook基于LevelDB实现的一款可嵌入式的持久化键值(Key-Value)存储数据库,目前为facebook内部大量业务提供服务。由于其有高性能和高适配性的特点,所以被大量的应用于对传统数据库引擎的高性能改造,例如商业数据库引擎 TerarkDB 分布式关系型数据库 TIDB 等都是应用了 ROCKSDB 来实现高性能的。
3794 0
|
存储 关系型数据库 MySQL
MySQL · myrocks · collation 限制
背景 MyRocks中的数据是按索引列以memcmp方式进行排序的。对于一些数字类型,需要进行转化才能直接通过memcmp进行比较, 例如有符号数在计算机中是用补码表示的,那么如果负数和正数直接按字节比较,结果负数会比正数大,实际存储时会将符号会反转存储,读取时再转化回来。
1575 0
|
存储 关系型数据库 MySQL
MySQL · myrocks · clustered index特性
Cluster index介绍 最近在RDS MyRocks中,我们引入了一个重要功能,二级聚集索引(secondary clustering index). 我们知道innodb和rocksdb引擎的主键就是clustered index。
1849 0