doris索引

目前 Doris 主要支持两类索引:

- 内建的智能索引:包括前缀索引和 ZoneMap 索引。
- 用户创建的二级索引:包括 Bloom Filter 索引 和 Bitmap倒排索引。

其中 ZoneMap 索引是在列存格式上,对每一列自动维护的索引信息,包括 Min/Max,Null 值个数等等。这种索引对用户透明。

1 前缀索引

doris中,对于前缀索引有如下约束:

  1. 他的索引键最大长度是36个字节
  2. 当他遇到了varchar数据类型的时候,即使没有超过36个字节,也会自动截断

示例1:以下表中我们定义了: user_id,age,message作为表的key ;

在这里插入图片描述
doris为这个表创建前缀索引时,它生成的索引键如下:


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字段,它自动截断,不会再往后面取了

2 Bloom Filter 索引

1. Bloom Filter 本质上是一种位图结构,用于判断一个值是否存在
2. 会产生小概率的误判,因为hash算法天生的碰撞
3. 在doris中是以tablet为粒度创建的,给每一个tablet创建一个布隆过滤器索引

在这里插入图片描述
创建BloomFileter索引

  • 建表的时候指定
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" = "");

建表示例:

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 索引:

  1. BloomFilter是在无法利用前缀索引的查询场景中,来加快查询速度的。
  2. 查询会根据该列高频过滤,而且查询条件大多是 in 和 = 过滤。
  3. 不同于Bitmap, BloomFilter适用于高基数列。比如UserID。因为如果创建在低基数的列上,比如 “性别” 列,则每个Block几乎都会包含所有取值,导致BloomFilter索引失去意义。字段随机

Doris BloomFilter使用注意事项
4. 不支持对Tinyint、Float、Double 类型的列建Bloom Filter索引。
5. Bloom Filter索引只对 in 和 = 过滤查询有加速效果。
6. 可以通过explain来查看命中了哪种索引 --没办法查看

3 Bitmap 索引

用户可以通过创建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;

注意事项

  • 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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache Doris可以使用多种索引来提高查询性能和数据存储效率。其中包括Aggregate表(Uniq表同理)添加rollup、Duplicate表添加rollup、key和前缀索引、Bloom Filter索引和Bitmap索引等。\[1\]\[2\]\[3\] 在Apache Doris中,可以通过在Aggregate表或Uniq表上添加rollup来创建索引。这样可以提高查询性能和聚合操作的效率。 Duplicate表也可以添加rollup来创建索引,这样可以提高查询性能和去重操作的效率。 另外,Apache Doris还支持key和前缀索引。通过创建key和前缀索引,可以提高查询命中前缀索引的规则,从而提高查询性能。 对于高基数的列,比如UserID,可以使用Bloom Filter索引。Bloom Filter索引适合在高基数的列上创建,因为它可以快速判断某个值是否存在于索引中。 而对于低基数的列,比如"性别"列,使用Bloom Filter索引可能失去意义,因为每个Block几乎都会包含所有取值。 此外,Apache Doris还支持Bitmap索引。Bitmap索引占用的空间非常小,创建和使用非常快。当根据键值查询时,可以快速定位到具体的行号。而当根据键值做and/or或in(x,y,..)查询时,可以直接使用索引的位图进行或运算,快速得出结果行数据。 综上所述,Apache Doris提供了多种索引类型,可以根据具体的需求选择合适的索引来提高查询性能和数据存储效率。 #### 引用[.reference_title] - *1* [Apache Doris的Rollup和前缀索引](https://blog.csdn.net/yy8623977/article/details/120929403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Apache doris索引机制介绍](https://blog.csdn.net/hf200012/article/details/119272670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值