StarRocks 支持基于Bitmap索引,对于有Filter的查询有明显的加速效果。
Bitmap是元素为1个bit的, 取值为0,1两种情形的, 可对某一位bit进行置位(set)和清零(clear)操作的数组. Bitmap的使用场景有:
Bitmap只能表示取值为两种情形的列数组, 当列的取值为多种取值情形枚举类型时, 例如季度(Q1, Q2, Q3, Q4), 系统平台(Linux, Windows, FreeBSD, MacOS), 则无法用一个Bitmap编码; 此时可以为每个取值各自建立一个Bitmap的来表示这组数据; 同时为实际枚举取值建立词典.
如上图所示,Platform列有4行数据,可能的取值有Android、Ios。StarRocks中会首先针对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,StarRocks会首先查找字典,找出iOS对于的编码值是1,然后再去查找 Bitmap Index,知道1对应的Bitmap是1000,我们就知道只有第4行数据符合查询条件,StarRocks就会只读取第4行数据,不会读取所有数据。
StarRocks对于建表中的前置列可以通过shortkey索引快速过滤,但是对于非前置列, 无法利用shortkey索引快速过滤,如果需要对非前置列进行快速过滤,就可以对这些列建立Bitmap索引。
由于Bitmap可以快速的进行bitwise运算。所以在多列过滤的场景中,也可以考虑对每列分别建立Bitmap索引。
在 table1 上为site_id 列创建 Bitmap 索引:
CREATE INDEX index_name ON table1 (site_id) USING BITMAP COMMENT 'balabala';
展示指定 table_name 的下索引:
SHOW INDEX FROM example_db.table_name;
下面语句可以从一个表中删除指定名称的索引:
DROP INDEX index_name ON [db_name.]table_name;
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://docs.starrocks.com/zh-cn/main/table_design/Bitmap_index
内容来源于网络,如有侵权,请联系作者删除!