目前 Doris 主要支持两类索引:
- 内建的智能索引:包括前缀索引和 ZoneMap 索引。
- 用户创建的二级索引:包括 Bloom Filter 索引 和 Bitmap倒排索引。
其中 ZoneMap 索引是在列存格式上,对每一列自动维护的索引信息,包括 Min/Max,Null 值个数等等。这种索引对用户透明。
doris中,对于前缀索引有如下约束:
示例1:以下表中我们定义了: user_id,age,message作为表的key ;
user_id(8 Bytes) + age(4 Bytes) + message(prefix 24 Bytes)
示例2:以下表中我们定义了:age,user_name,message作为表的key
那么,doris为这个表创建前缀索引时,它生成的索引键如下:
age(4 Bytes) +user_name(20 Bytes) 指定key的时候
虽然还没有超过36个字节,但是已经遇到了一个varchar字段,它自动截断,不会再往后面取了
1. Bloom Filter 本质上是一种位图结构,用于判断一个值是否存在
2. 会产生小概率的误判,因为hash算法天生的碰撞
3. 在doris中是以tablet为粒度创建的,给每一个tablet创建一个布隆过滤器索引
PROPERTIES (
"bloom_filter_columns"="name,age,uid"
)
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" = "");
建表示例:
CREATE TABLE IF NOT EXISTS sale_detail_bloom (
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 1
PROPERTIES (
"replication_num" = "1",
"bloom_filter_columns"="saler_id,category_id",
"storage_medium" = "SSD"
);
查看BloomFilter索引
mysql> SHOW CREATE TABLE sale_detail_bloom \G;
*************************** 1. row ***************************
Table: sale_detail_bloom
Create Table: CREATE TABLE `sale_detail_bloom` (
`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')),
PARTITION P_202208 VALUES [('2022-08-01'), ('2022-09-01')),
PARTITION P_202209 VALUES [('2022-09-01'), ('2022-10-01')),
PARTITION P_202210 VALUES [('2022-10-01'), ('2022-11-01')))
DISTRIBUTED BY HASH(`saler_id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"bloom_filter_columns" = "category_id, saler_id"
)
1 row in set (0.00 sec)
修改/删除BloomFilter索引
ALTER TABLE sale_detail_bloom SET ("bloom_filter_columns" = "customer_id,saler_id");
Doris BloomFilter适用场景
满足以下几个条件时可以考虑对某列建立Bloom Filter 索引:
Doris BloomFilter使用注意事项
4. 不支持对Tinyint、Float、Double 类型的列建Bloom Filter索引。
5. Bloom Filter索引只对 in 和 = 过滤查询有加速效果。
6. 可以通过explain来查看命中了哪种索引 --没办法查看
用户可以通过创建bitmap index 加速查询
创建索引
在table1 上为siteid 创建bitmap 索引
CREATE INDEX [IF NOT EXISTS] index_name ON table1 (siteid) USING BITMAP COMMENT '这里是注释';
create index 索引名称 on 表名(给什么字段创建bitmap索引) using bitmap COMMENT '这里是注释';
create index user_id_bitmap on sale_detail_bloom(sku_id) USING BITMAP COMMENT '这里是注释';
查看索引
SHOW INDEX FROM example_db.table_name;
删除索引
DROP INDEX [IF EXISTS] index_name ON [db_name.]table_name;
注意事项