Apache Doris的Bitmap索引和BloomFilter索引使用及注意事项
1. Bitmap索引的使用
1.1位图索引简介
位图索引是位图索引,一种快速的数据结构,可以加快查询速度。
1.2使用位图索引的注意事项
使用限制:
目前索引仅支持bitmap类型的索引bitmap索引仅在单列上创建bitmap索引能够应用在Duplicate、Uniq数据模型的所有列和Aggregate模型的key列上bitmap索引仅在Segment V2储存格式下生效。当创建index时,表的存储格式将默认转换为V2格式位图索引支持的数据类型:
TINYINTSMALLINTINTUNSIGNEDINTBIGINTCHARVARCHARDATEDATETIMELARGEINTDECIMALBOOL1.3位图索引的使用
创建索引
mysql> create index if not exists click_bitmap_index on test_db.click (user_id) using bitmap comment 'bitmap index test';Query OK, 0 rows affected (0.05 sec)mysql>查看索引
mysql> show index from test_db.click;+-------------------------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |+-------------------------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------------+| default_cluster:test_db.click | | click_bitmap_index | | user_id | | | | | | BITMAP | bitmap index test |+-------------------------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------------+1 row in set (0.04 sec)mysql>删除索引
mysql> drop index if exists click_bitmap_index on test_db.click;Query OK, 0 rows affected (0.03 sec)mysql>2. BloomFilter索引
2.1布隆过滤器指数简介
它是一种多哈希函数映射的快速查找算法,本质上是一种位图结构。通常用于一些需要快速判断一个元素是否属于某个集合,但并不严格要求100%正确的场合,因为BloomFilter会告诉调用者某个元素在某个集合中存在还是不存在。但存在不一定准确。
2.2布隆过滤器的原理
实际上,它由一个超长的二进制位数组和一系列哈希函数组成。二进制位数组最初全是零。当给定一个元素时,它会被一系列哈希函数映射成一系列值,位数组中所有值的偏移量都被当作1。对于要查询的元素,将使用相同的哈希函数将其映射到位数组。只要有一个哈希函数没有映射前一个元素的偏移量,它就不存在于集合中。
下图是m = 18,k = 3 (m是位数组的大小,k是哈希函数的个数)的Bloom Filter的例子。集合中的x、y和z元素由三个不同的散列函数散列到一个位数组中。当查询元素W时,它不在集合中,因为通过哈希函数计算后有一位为0。
BloomFilter索引也是以块粒度创建的。在每个块中,指定列的值用作一个集合来生成BloomFilter索引条目,该条目用于快速筛选不符合查询条件的数据。
2.3布隆过滤器指数的使用
使用BloomFilter索引创建表
mysql> create table order_tb( -> user_id bigint, -> order_date date, -> city varchar(32), -> url varchar(512) -> ) distributed by hash(user_id, city) buckets 8 -> properties( -> 'bloom_filter_columns'='user_id,order_date' -> );Query OK, 0 rows affected (0.07 sec)mysql>检查BloomFilter索引
mysql> show create table order_tb;删除BloomFilter索引
mysql> alter table test_db.order_tb set ('bloom_filter_columns' = '');Query OK, 0 rows affected (0.05 sec)mysql>修改BloomFilter索引
mysql> alter table test_db.order_tb set ('bloom_filter_columns' = 'user_id,city');Query OK, 0 rows affected (0.05 sec)mysql>2.4 Doris BloomFilter使用场景
首先BloomFilter适用于非前缀过滤查询会根据该列高频过滤,而且查询条件大多是in和=过滤不同于Bitmap, BloomFilter适用于高基数列。比如UserID。因为如果创建在低基数的列上,比如”性别“列,则每个Block几乎都会包含所有取值,导致BloomFilter索引失去意义2.5使用多丽丝布鲁姆过滤器的注意事项
不支持对Tinyint、Float、Double 类型的列建Bloom Filter索引Bloom Filter索引只对in和=过滤查询有加速效果如果要查看某个查询是否命中了Bloom Filter索引,可以通过查询的Profile信息查看关于Apache Doris的位图索引和BloomFilter索引的使用,本文到此结束。关于Apache Doris index的更多信息,请搜索Script House之前的文章或者继续浏览下面的相关文章。希望大家以后多多支持剧本之家!
如果您的问题还未解决可以联系站长付费协助。
有问题可以加入技术QQ群一起交流学习
本站vip会员 请加入无忧模板网 VIP群(50604020) PS:加入时备注用户名或昵称
普通注册会员或访客 请加入无忧模板网 技术交流群(50604130)
客服微信号:15898888535
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若内容侵犯了原著者的合法权益,可联系站长删除。