绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
DorisDB系列文档(八)bitmap索引
2022-07-28 10:30:42

DorisDB 支持基于Bitmap索引,对于有Filter的查询有明显的加速效果。

原理
1 什么是Bitmap



Bitmap是元素为1个bit的, 取值为0,1两种情形的, 可对某一位bit进行置位(set)和清零(clear)操作的数组. Bitmap的使用场景有:

用两个long型表示16学生的性别, 0表示女生, 1表示男生.
用bitmap表示一组数据中是否存在null值, 0表示元素不为null, 1表示为null.
一组数据的取值为(Q1, Q2, Q3, Q4), 表示季度; 用bitmap表示这组数据中取值为Q4的元素; 1表示取值为Q4的元素, 0表示其他取值的元素.
2 什么是 Bitmap索引




Bitmap只能表示取值为两种情形的列数组, 当列的取值为多种取值情形枚举类型时, 例如季度(Q1, Q2, Q3, Q4), 系统平台(Linux, Windows, FreeBSD, MacOS), 则无法用一个Bitmap编码; 此时可以为每个取值各自建立一个Bitmap的来表示这组数据; 同时为实际枚举取值建立词典.



如上图所示,Platform列有4行数据,可能的取值有Android、Ios。DorisDB中会首先针对Platform列构建一个字典,将Android和Ios映射为int,然后就可以对Android和Ios分别构建Bitmap。具体来说,我们分别将Android、Ios 编码为0和1,因为Android出现在第1,2,3行,所以Bitmap是0111,因为Ios出现在第4行,所以Bitmap是1000。



假如有一个针对包含该Platform列的表的SQL查询,select xxx from table where Platform = iOS,DorisDB会首先查找字典,找出iOS对于的编码值是1,然后再去查找 Bitmap Index,知道1对应的Bitmap是1000,我们就知道只有第4行数据符合查询条件,DorisDB就会只读取第4行数据,不会读取所有数据。

适用场景
1 非前缀过滤

参考 shortkey索引,DorisDB对于建表中靠前的列可以通过shortkey索引快速过滤,但是对于中间和靠后的列, 无法利用shortkey索引快速过滤,如果需要对表中中间和靠后的列进行快速过滤,就可以对表中中间和靠后的列建立Bitmap索引。

2 多列过滤Filter

由于Bitmap可以快速的进行bitwise运算。所以在多列过滤的场景中,也可以考虑对每列分别建立Bitmap索引。

如何使用
1 创建索引

在 table1 上为site_id 列创建 Bitmap 索引:

CREATE INDEX index_name ON table1 (site_id) USING BITMAP COMMENT 'balabala';
2 查看索引

展示指定 table_name 的下索引:

SHOW INDEX FROM example_db.table_name;
3 删除索引

下面语句可以从一个表中删除指定名称的索引:

DROP INDEX index_name ON [db_name.]table_name;
注意事项
对于明细模型,所有列都可以建Bitmap 索引;对于聚合模型,只有Key列可以建Bitmap 索引。
Bitmap索引, 应该在取值为枚举型, 取值大量重复, 较低基数, 并且用作等值条件查询或者可转化为等值条件查询的列上创建.
不支持对Float、Double、Decimal 类型的列建Bitmap 索引。
如果要查看某个查询是否命中了Bitmap索引,可以通过查询的Profile信息查看(TODO:加上查看Profile的链接)。
————————————————
版权声明:本文为CSDN博主「白眼黑刺猬」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37933018/article/details/116118684

分享好友

分享这个小栈给你的朋友们,一起进步吧。

DorisDB
创建时间:2022-04-26 11:23:19
DorisDB
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~