大数据Doris(二十一):Bloom Filter索引以及Doris索引总结

news2024/10/5 21:19:55

文章目录

Bloom Filter索引以及Doris索引总结

一、Bloom Filter索引

1、BloomFilter索引原理

2、BloomFilter索引语法

3、注意事项

二、Doris索引总结


Bloom Filter索引以及Doris索引总结

一、Bloom Filter索引

1、BloomFilter索引原理

BloomFilter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合,BloomFilter有以下特点:

  • 空间效率高的概率型数据结构,用来检查一个元素是否在一个集合中。
  • 对于一个元素检测是否存在的调用,BloomFilter会告诉调用者两个结果之一:可能存在或者一定不存在。
  • 缺点是存在误判,告诉你可能存在,不一定真实存在。

布隆过滤器实际上是由一个超长的二进制位数组和一系列的哈希函数组成。二进制位数组初始全部为0,当给定一个待查询的元素时,这个元素会被一系列哈希函数计算映射出一系列的值,所有的值在位数组的偏移量处置为1。

下图所示出一个 m=18, k=3 (m是该Bit数组的大小,k是Hash函数的个数)的Bloom Filter示例。集合中的 x、y、z 三个元素通过 3 个不同的哈希函数散列到位数组中。当查询元素w时,通过Hash函数计算之后因为有一个比特为0,因此w不在该集合中。

那么怎么判断某个元素是否在集合中呢?同样是这个元素经过哈希函数计算后得到所有的偏移位置,若这些位置全都为1,则判断这个元素在这个集合中,若有一个不为1,则判断这个元素不在这个集合中,就是这么简单!

布隆过滤器索引使用非常广泛,在大数据组件HBase就提供了布隆过滤器,它允许你对存储在每个数据块的数据做一个反向测试。当某行被请求时,通过布隆过滤器先检查该行是否不在这个数据块,布隆过滤器要么确定回答该行不在,要么回答它不知道。这就是为什么我们称它是反向测试。

布隆过滤器同样也可以应用到行里的单元上,当访问某列标识符时可以先使用同样的反向测试。但布隆过滤器也不是没有代价,存储这个额外的索引层次会占用额外的空间,布隆过滤器随着它们的索引对象数据增长而增长,所以行级布隆过滤器比列标识符级布隆过滤器占用空间要少。当空间不是问题时,它们可以帮助你榨干系统的性能潜力。

Doris 的 BloomFilter 索引需要通过建表的时候指定,或者通过表的 ALTER 操作来完成。Bloom Filter本质上是一种位图结构,用于快速的判断一个给定的值是否在一个集合中,这种判断会产生小概率的误判,即如果返回false,则一定不在这个集合内。而如果范围true,则有可能在这个集合内。

BloomFilter索是以Block(1024行)为粒度创建的,每1024行中,指定列的值作为一个集合生成一个BloomFilter索引条目,用于在查询时快速过滤不满足条件的数据。

2、BloomFilter索引语法

  • 创建 BloomFilter 索引

Doris BloomFilter索引的创建是通过在建表语句的PROPERTIES里加上"bloom_filter_columns"="k1,k2,k3",这个属性,k1,k2,k3是你要创建的BloomFilter索引的Key列名称,例如下面我们对表里的saler_id,category_id创建了BloomFilter索引。

CREATE TABLE IF NOT EXISTS example_db.example_bloom_index_tbl  (
    sale_date date NOT NULL COMMENT "销售时间",
    customer_id int NOT NULL COMMENT "客户编号",
    saler_id int NOT NULL COMMENT "销售员",
    sku_id int NOT NULL COMMENT "商品编号",
    category_id int NOT NULL COMMENT "商品分类",
    sale_count int NOT NULL COMMENT "销售数量",
    sale_price DECIMAL(12,2) NOT NULL COMMENT "单价",
    sale_amt DECIMAL(20,2)  COMMENT "销售总金额"
)
Duplicate  KEY(sale_date, customer_id,saler_id,sku_id,category_id)
PARTITION BY RANGE(sale_date)
(
PARTITION P_202111 VALUES [('2021-11-01'), ('2021-12-01'))
)
DISTRIBUTED BY HASH(saler_id) BUCKETS 10
PROPERTIES (
"replication_num" = "3",
"bloom_filter_columns"="saler_id,category_id"
);
  • 查看 BloomFilter 索引

查看我们在表上建立的BloomFilter索引命令如下:

SHOW CREATE TABLE <table_name>;

执行之后,查看对应建表语句PROPERTIES中是否有"bloom_filter_columns"配置项。

mysql> SHOW CREATE TABLE example_db.example_bloom_index_tbl\G;
*************************** 1. row ***************************
       Table: example_bloom_index_tbl
Create Table: CREATE TABLE `example_bloom_index_tbl` (
  `sale_date` date NOT NULL COMMENT '销售时间',
  `customer_id` int(11) NOT NULL COMMENT '客户编号',
  `saler_id` int(11) NOT NULL COMMENT '销售员',
  `sku_id` int(11) NOT NULL COMMENT '商品编号',
  `category_id` int(11) NOT NULL COMMENT '商品分类',
  `sale_count` int(11) NOT NULL COMMENT '销售数量',
  `sale_price` decimal(12, 2) NOT NULL COMMENT '单价',
  `sale_amt` decimal(20, 2) NULL COMMENT '销售总金额'
) ENGINE=OLAP
DUPLICATE KEY(`sale_date`, `customer_id`, `saler_id`, `sku_id`, `category_id`)
COMMENT 'OLAP'
PARTITION BY RANGE(`sale_date`)
(PARTITION P_202111 VALUES [('2021-11-01'), ('2021-12-01')))
DISTRIBUTED BY HASH(`saler_id`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"bloom_filter_columns" = "category_id, saler_id",
"in_memory" = "false",
"storage_format" = "V2",
"disable_auto_compaction" = "false"
);
1 row in set (0.00 sec)
  • 删除BloomFilter 索引

删除BloomFilter索引即将索引列从bloom_filter_columns属性中移除,命令如下:

ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "");

删除表 example_db.example_bloom_index_tbl 中的布隆索引:

mysql> alter table example_db.example_bloom_index_tbl set ("bloom_filter_columns" = "");
Query OK, 0 rows affected (0.05 sec)

以上语句执行完成后,可以执行 "show create table example_db.example_bloom_index_tbl\G;"查看建表语句参数中已经没有布隆过滤器的配置参数。

  • 修改BloomFilter 索引

修改BloomFilter索引即修改表对应的 bloom_filter_columns属性,语法如下:

ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "k1,k3");

 现在给表example_db.example_bloom_index_tbl中 category_id 列创建布隆过滤器,操作如下:

ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "k1,k3");

现在给表example_db.example_bloom_index_tbl中 category_id 列创建布隆过滤器,操作如下:

mysql> alter table example_db.example_bloom_index_tbl set ("bloom_filter_columns"="category_id");
Query OK, 0 rows affected (0.04 sec)

mysql> show create table example_db.example_bloom_index_tbl\G;
*************************** 1. row ***************************
...
(PARTITION P_202111 VALUES [('2021-11-01'), ('2021-12-01')))
DISTRIBUTED BY HASH(`saler_id`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"bloom_filter_columns" = "category_id",
"in_memory" = "false",
"storage_format" = "V2",
"disable_auto_compaction" = "false"
);
... ...

3、注意事项

  • BloomFilter适用于非前缀过滤。
  • 查询会根据该列高频过滤,而且查询条件大多是 in 和 = 过滤。
  • 不同于Bitmap, BloomFilter适用于高基数列。比如UserID。因为如果创建在低基数的列上,比如 "性别" 列,则每个Block几乎都会包含所有取值,导致BloomFilter索引失去意义。
  • 不支持对Tinyint、Float、Double 类型的列建Bloom Filter索引。
  • Bloom Filter索引只对 in 和 = 过滤查询有加速效果。

二、Doris索引总结

  • Doris对数据进行有序存储, 在数据有序的基础上为其建立稀疏索引,索引粒度为 block(1024行)。
  • 稀疏索引选取 schema 中固定长度的前缀作为索引内容, 目前 Doris 选取 36 个字节的前缀作为索引。
  • 建表时建议将查询中常见的过滤字段放在 Schema 的前面, 区分度越大,频次越高的查询字段越往前放。
  • 这其中有一个特殊的地方,就是 varchar 类型的字段。varchar 类型字段只能作为稀疏索引的最后一个字段。索引会在 varchar 处截断, 因此 varchar 如果出现在前面,可能索引的长度可能不足 36 个字节。
  • 除稀疏索引之外,Doris还提供bloomfilter索引, bloomfilter索引对区分度比较大的列过滤效果明显。如果考虑到varchar不能放在稀疏索引中,可以建立bloomfilter索引。

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动机器人运动规划---基于图搜索的基础知识---广度优先遍历与深度优先遍历

移动机器人运动规划---基于图搜索的基础知识---广度优先遍历与深度优先遍历 广度优先搜索&#xff08;BFS&#xff09;深度优先搜索&#xff08;DFS&#xff09;BFS vs DFS 图搜索优化的方向就是&#xff1a; 按照什么规则去访问节点&#xff0c;按照什么规则弹出节点&#xff…

快速了解 TypeScript

目录 1、简介 2、安装TypeScript 3、编译代码 4、类型注解 5、接口 6、类 7、运行TypeScript Web应用 1、简介 TypeScript是JavaScript类型的超集&#xff0c;它可以编译成纯JavaScript。 TypeScript可以在任何浏览器、任何计算机和任何操作系统上运行&#xff0c;并且…

【哈士奇赠书活动 - 23期】-〖你好 ChatGPT〗

文章目录 ⭐️ 赠书 - 《你好 ChatGPT》⭐️ 内容简介⭐️ 作者简介⭐️ 精彩书评⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《你好 ChatGPT》 ⭐️ 内容简介 人工智能&#xff08;AI&#xff09;时代已经来临&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;正在进一步…

【精选】各种节日祝福(C语言,可修改),Easyx图形库应用+源代码分享

博主&#xff1a;命运之光✨✨ 专栏&#xff1a;Easyx图形库应用&#x1f4c2; 目录 ✨一、程序展示 范例一&#xff1a;❤新年祝福❤ 范例二&#xff1a;❤母亲节祝福❤ ✨二、项目环境 简单介绍一下easyx图形库应用 Easyx图形库 ✨三、运行效果展示&#xff08;视频&am…

【C++起飞之路】初级——缺省参数、函数重载、引用

C&#xff1a;函数重载、引用 一、缺省参数&#x1f6eb;1.1 &#x1f69d;什么是缺省参数1.2 &#x1f69d;缺省参数的分类a. 全缺省参数b. 半缺省参数&#xff08;部分缺省参数&#xff09; 1.3 &#x1f69d;注意事项 二、函数重载&#x1f6eb;2.1 &#x1f69d;什么是函数…

时间复杂度:根号n一般来说大于log(n)

f ( x ) x − l o g 2 x f(x)\sqrt{x}-log_2 x f(x)x ​−log2​x 对这函数求导后&#xff0c;比较分母大小&#xff0c;可以得到结论 f ( x ) f(x) f(x)先减后增&#xff0c;分界点为 x 4 ( l n 2 ) 2 x \frac{4}{(ln2)^2} x(ln2)24​ f ( x ) f(x) f(x)的图像如下所示&a…

PPT技能之文字格式,转身的文字这样做

只要用PPT&#xff0c;一定需要设置文字格式。好的文字格式&#xff0c;给人惊艳的感觉&#xff0c;是一种愉悦的享受。 你的关注&#xff0c;是我最大的动力&#xff01;你的转发&#xff0c;我的10W&#xff01;茫茫人海有你的支持&#xff0c;给我无限动力。 1、字体。 按…

什么是Java中的阻塞队列?它有什么作用?

在Java中&#xff0c;阻塞队列是一种特殊的队列&#xff0c;它可以在队列为空或队列已满时阻塞添加或移除元素的操作。阻塞队列通常用于多线程编程中&#xff0c;可以帮助我们更加方便地进行线程通信和协作。在本文中&#xff0c;我将从面试的角度&#xff0c;详细讲解Java中的…

在线办公时代,如何选择合适的云办公软件?

文章目录 在线办公时代&#xff0c;如何选择合适的云办公软件&#xff1f;在线文档石墨文档腾讯文档飞书文档 远程控制ToDesk向日葵 会议协同腾讯会议ZOOM 总结 在线办公时代&#xff0c;如何选择合适的云办公软件&#xff1f; 随着数字经济的发展和疫情的影响&#xff0c;云办…

100天精通Python(可视化篇)——第87天:matplotlib绘制不同种类炫酷雷达图参数说明+代码实战(普通、堆叠、多个、矩阵、极坐标雷达图)

文章目录 专栏导读1. 雷达图1&#xff09;介绍2&#xff09;参数说明 2. 基本雷达图3. 堆叠雷达图4. 六边形战士5. 多个雷达图6. 雷达图矩阵7. 极坐标雷达图 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到就业》&#xff1a;本专栏专门针对零基础…

做一名活动策划是什么体验

在一些不了解的人眼中&#xff0c;活动策划就是那种外表光鲜亮丽&#xff0c;气场十足&#xff0c;眼神犀利&#xff0c;跷着二郎腿&#xff0c;情绪饱满的完成一场又一场的完美的秀。 好像确实是这样&#xff0c;但是你们又知不知道这背后的一切我们活动策划到底付出了什么&a…

SpringMVC的三大功能

目录 一、初识SpringMVC 1.1 MVC的定义 1.2 MVC和SpringMVC的关系是什么? 1.3 SpringMVC的重要性 二、Spring MVC的三大功能 2.1 连接功能 2.1.1 RequestMapping 注解介绍 2.1.2 GetMapping 和 PostMapping 2.2 获取参数功能 2.2.1 传递普通参数 2.2.2 传递对象 2…

【K8s】Ingress的使用

文章目录 一、Ingress介绍1、Ingress的作用2、Ingress工作流程 二、Ingress使用1、测试数据准备2、HTTP代理3、HTTPS代理 一、Ingress介绍 1、Ingress的作用 上一章中&#xff0c;NotePort和LoadBalancer类型的Service可给集群外部机器提供访问&#xff0c;但这两种类型都有缺…

JavaScript数组

1.数组是什么 2.数组的基本使用 3.操作数组 4.数组案例 一、数组是什么&#xff1f; 1.数组(Array)是一种可以按顺序保存数据的数据类型2.为什么要使用数组&#xff1f;例如&#xff1a;如果想保存一个班所有同学的姓名怎么办&#xff1f;场景&#xff1a;如果有多个数据可以用…

vue3中ts定义对象,pinia中使用ts定义状态对象

文章目录 引入reactive中使用数组reactive中定义对象类型pinia中定义状态对象 引入 用惯了js&#xff0c;突然使用ts属实有点不习惯&#xff0c;这里介绍一下自己在vue3中使用ts初始化内容的一些小技巧 reactive中使用数组 例如下面所示的代码&#xff0c;我们就像写js代码一…

数组a与数组b作内积:即a和b所有对应位置两元素相乘 将所有的相乘结果(积)求和 numpy.inner(a,b)

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 数组a与数组b作内积&#xff1a; 即a和b所有对应位置两元素相乘 将所有的相乘结果(积)求和 numpy.inner(a,b) [太阳]选择题 请问关于以下代码的输出结果是&#xff1f; import numpy as np …

招银网络科技-2024届暑期实习-Java后端开发

目录 1.SpringBoot 中的 SpringBootApplication注解的作用是什么&#xff1f;2.SpringBoot 中你们是如何加载配置信息的&#xff1f;3.RabbitMQ 如何保证消息不丢失&#xff1f;4.如果消费者这边消费到一半宕机了怎么办&#xff1f;5.RabbitMQ 如何保证消息没有被重复消费&…

C语言函数大全-- w 开头的函数(3)

C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcsdup 1.1 函数说明 函数声明函数功能wchar_t *wcsdup(const wchar_t *str);用于复制宽字符字符串 参数&#xff1a; str &#xff1a; 待复制的宽字符串 返回值&#xff1a; 如果成功复制&#xff0c;则返回指向该…

跨域解决方案

同源策略 同源策略是一种约定&#xff0c;它是浏览器最核心也是最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;浏览器很容易受到XSS、CSRF等攻击。 所谓的同源是指【协议域名端口】三者相同&#xff0c;即便两个不同的域名&#xff0c;指向同一个IP地址&#xf…

手把手教你下载darknet_ros

前两天下载darknet_ros&#xff0c;好怪啊&#xff0c;是我太菜了&#xff0c;根本看不懂这都啥啊&#xff0c;所以记录一下 首先附上链接 这里是github上的代码&#xff1a;https://github.com/leggedrobotics/darknet_ros 这里是gitcode上的代码&#xff1a;https://gitcode…