Doris(三) -- 索引
索引索引用于帮助快速过滤或查找数据。
目前 Doris 主要支持两类索引:
• 内建的智能索引:包括前缀索引和 ZoneMap 索引。
• 用户创建的二级索引:包括 Bloom Filter 索引 和 Bitmap倒排索引。
其中 ZoneMap 索引是在列存格式上,对每一列自动维护的索引信息,包括 Min/Max,Null 值个数等等。这种索引对用户透明。
前缀索引
doris中,对于前缀索引有如下约束:
[*]他的索引键最大长度是36个字节
[*]当他遇到了varchar数据类型的时候,即使没有超过36个字节,也会自动截断
https://img2023.cnblogs.com/blog/1742816/202305/1742816-20230528192215900-382115962.png
doris为这个表创建前缀索引时,它生成的索引键如下:
user_id(8 Bytes) + age(4 Bytes) + message(prefix 24 Bytes)以下表中我们定义了:age,user_name,message作为表的key
https://img2023.cnblogs.com/blog/1742816/202305/1742816-20230528192314170-2006220961.png
那么,doris为这个表创建前缀索引时,它生成的索引键如下:
age(4 Bytes) +user_name(20 Bytes)
-- 虽然还没有超过36个字节,但是已经遇到了一个varchar字段,它自动截断,不会再往后面取了当我们的查询条件,是前缀索引的前缀时,可以极大的加快查询速度。
SELECT * FROM table WHERE user_id=1829239 and age=20
-- 该查询的效率会远高于以下查询:
SELECT * FROM table WHERE age=20;Bloom Filter 索引
https://img2023.cnblogs.com/blog/1742816/202305/1742816-20230528192504073-1035623617.png
[*]Bloom Filter 本质上是一种位图结构,用于判断一个值是否存在
[*]会产生小概率的误判,因为hash算法天生的碰撞
[*]在doris中是以tablet为粒度创建的,给每一个tablet创建一个布隆过滤器索引
创建BloomFilter索引
[*]建表的时候指定
PROPERTIES (
"bloom_filter_columns"="name,age,uid"
)
[*]alter修改表的时候指定
ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "k1,k3");
ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "k1,k4");
ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "");
-- 查看BloomFilter索引
SHOW CREATE TABLE sale_detail_bloom \G;
-- 修改/删除BloomFilter索引
ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "customer_id,saler_id");Doris BloomFilter适用场景
满足以下几个条件时可以考虑对某列建立Bloom Filter 索引:
[*]BloomFilter是在无法利用前缀索引的查询场景中,来加快查询速度的。
[*]查询会根据该列高频过滤,而且查询条件大多是 in 和 = 过滤。
[*]不同于Bitmap, BloomFilter适用于高基数列。比如UserID。因为如果创建在低基数的列上,比如 “性别” 列,则每个Block几乎都会包含所有取值,导致BloomFilter索引失去意义。字段随机
Doris BloomFilter使用注意事项
[*]不支持对Tinyint、Float、Double 类型的列建Bloom Filter索引。
[*]Bloom Filter索引只对 in 和 = 过滤查询有加速效果。
[*]可以通过explain来查看命中了哪种索引--没办法查看
Bitmap 索引
用户可以通过创建bitmap index 加速查询
https://img2023.cnblogs.com/blog/1742816/202305/1742816-20230528192719245-1738356092.png
创建索引
在table1 上为siteid 创建bitmap 索引
CREATE INDEX index_name ON table1 (siteid) USING BITMAP COMMENT 'balabala';
create index 索引名称on 表名(给什么字段创建bitmap索引) using bitmap COMMENT 'balabala';
create index user_id_bitmap on sale_detail_bloom(sku_id) USING BITMAP COMMENT '使用user_id创建的bitmap索引';
-- 查看索引
SHOW INDEX FROM example_db.table_name;
-- 删除索引
DROP INDEX index_name ON table_name;注意事项
[*]bitmap 索引仅在单列上创建。
[*]bitmap 索引能够应用在 Duplicate、Uniq 数据模型的所有列和 Aggregate模型的key列上。
[*]bitmap 索引支持的数据类型如下:(老版本只支持bitmap类型)
TINYINT,SMALLINT,INT,BIGINT,CHAR,VARCHAR,DATE,DATETIME,LARGEINT,DECIMAL,BOOL
[*]bitmap索引仅在 Segment V2 下生效(Segment V2是升级版本的文件格式)。当创建 index 时,表的存储格式将默认转换为 V2 格式
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]