Doris的索引

Doris索引

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

1. 内建的智能索引,包括前缀索引(每行数据的最多前36字节)和 ZoneMap 索引(Min/Max,Null 值个数等)。

前缀索引:每行数据的最多前36字节,遇到varchar不会继续读后续字段,建表时需要设计好字段的顺序,每个表只有一个前缀索引。

2. 用户手动创建的二级索引,包括 倒排索引-关键词加速bloomfilter索引-in单值查询加速ngram bloomfilter索引-like查询加速bitmap索引-查询加速

倒排索引

作用: 根据关键词快速定位包含它的行,加速WHERE子句查询

​ inverted index:倒排索引,是信息检索领域常用的索引技术,将文本分割成一个个词,构建 词 -> 文档编号 的索引,可以快速查找一个词在哪些文档出现。

​ 在Doris的倒排索引实现中,table的一行对应一个文档、一列对应文档中的一个字段,因此利用倒排索引可以根据关键词快速定位包含它的行,达到WHERE子句加速的目的。

CREATE TABLE table_name
(
  columns_difinition,
  INDEX idx_name1(column_name1) USING INVERTED [PROPERTIES("parser" = "english|unicode|chinese")] [COMMENT 'your comment']
  INDEX idx_name2(column_name2) USING INVERTED [PROPERTIES("parser" = "english|unicode|chinese")] [COMMENT 'your comment']
  INDEX idx_name3(column_name3) USING INVERTED [PROPERTIES("parser" = "chinese", "parser_mode" = "fine_grained|coarse_grained")] [COMMENT 'your comment']
  INDEX idx_name4(column_name4) USING INVERTED [PROPERTIES("parser" = "english|unicode|chinese", "support_phrase" = "true|false")] [COMMENT 'your comment']
)
table_properties;

USING INVERTED指定索引类型, parser指定分词器, parser_mode用于指定分词的模式 , support_phrase用于指定索引是否支持MATCH_PHRASE短语查询加速。建表后也可以改动,详细语法参见官网文档倒排索引

倒排索引在不同数据模型中有不同的使用限制:

  • Aggregate 模型:只能为 Key 列建立倒排索引。
  • Unique 模型:需要开启 merge on write 特性,开启后,可以为任意列建立倒排索引。
  • Duplicate 模型:可以为任意列建立倒排索引。

bloomfilter索引

作用: 提高 in 和 = 过滤效率
-- 表里的saler_id,category_id创建了BloomFilter索引。
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 10
PROPERTIES (
"replication_num" = "3",
"bloom_filter_columns"="saler_id,category_id",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.start" = "-2147483648",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "P_",
"dynamic_partition.replication_num" = "3",
"dynamic_partition.buckets" = "3"
);
-- 删除索引
ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "");                       
-- 修改索引
ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "saler_id,category_id,sku_id");

Doris BloomFilter索引及使用使用场景:

满足以下几个条件时可以考虑对某列建立Bloom Filter 索引:

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

Doris BloomFilter使用注意事项:

  1. 不支持对Tinyint、Float、Double 类型的列建Bloom Filter索引。
  2. Bloom Filter索引只对 in 和 = 过滤查询有加速效果。
  3. 如果要查看某个查询是否命中了Bloom Filter索引,可以通过查询的Profile信息查看。

BloomFilter过滤器介绍:
BloomFilter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合,BloomFilter有以下特点:

  • 空间效率高的概率型数据结构,用来检查一个元素是否在一个集合中。
  • 对于一个元素检测是否存在的调用,BloomFilter会告诉调用者两个结果之一:可能存在或者一定不存在。
  • 缺点是存在误判,告诉你可能存在,不一定真实存在。

Bloom Filter本质上是一种位图结构,用于快速的判断一个给定的值是否在一个集合中。这种判断会产生小概率的误判。即如果返回false,则一定不在这个集合内。而如果范围true,则有可能在这个集合内。

ngram bloomfilter索引

作用: 提升like的查询性能
CREATE TABLE `table3` (
  `siteid` int(11) NULL DEFAULT "10" COMMENT "",
  `citycode` smallint(6) NULL COMMENT "",
  `username` varchar(32) NULL DEFAULT "" COMMENT "",
  INDEX idx_ngrambf (`username`) USING NGRAM_BF PROPERTIES("gram_size"="3", "bf_size"="256") COMMENT 'username ngram_bf index'
) ENGINE=OLAP
AGGREGATE KEY(`siteid`, `citycode`, `username`) COMMENT "OLAP"
DISTRIBUTED BY HASH(`siteid`) BUCKETS 10
PROPERTIES (
"replication_num" = "1"
);
-- PROPERTIES("gram_size"="3", "bf_size"="256"),分别表示gram的个数和bloom filter的字节数。
-- gram的个数跟实际查询场景相关,通常设置为大部分查询字符串的长度,bloom filter字节数,可以通过测试得出,通常越大过滤效果越好,可以从256开始进行验证测试看看效果。当然字节数越大也会带来索引存储、内存cost上升。
-- 如果数据基数比较高,字节数可以不用设置过大,如果基数不是很高,可以通过增加字节数来提升过滤效果。
alter table example_db.table3 add index idx_ngrambf(username) using NGRAM_BF PROPERTIES("gram_size"="2", "bf_size"="512")comment 'username ngram_bf index' 

Doris NGram BloomFilter使用注意事项

  1. NGram BloomFilter只支持字符串列
  2. NGram BloomFilter索引和BloomFilter索引为互斥关系,即同一个列只能设置两者中的一个
  3. NGram大小和BloomFilter的字节数,可以根据实际情况调优,如果NGram比较小,可以适当增加BloomFilter大小
  4. 如果要查看某个查询是否命中了NGram Bloom Filter索引,可以通过查询的Profile信息查看

bitmap索引

作用: 加速查询

用户可以通过创建bitmap index 加速查询 本文档主要介绍如何创建 index 作业,以及创建 index 的一些注意事项和常见问题。

名词解释

  • bitmap index:位图索引,是一种快速数据结构,能够加快查询速度

原理介绍

创建和删除本质上是一个 schema change 的作业,具体细节可以参照 Schema Change

语法

** 创建索引**

在table1 上为siteid 创建bitmap 索引

CREATE INDEX [IF NOT EXISTS] index_name ON table1 (siteid) USING BITMAP COMMENT 'balabala';

查看索引

展示指定 table_name 的下索引

SHOW INDEX FROM example_db.table_name;

删除索引

删除指定 table_name 的下索引

DROP INDEX [IF EXISTS] index_name ON [db_name.]table_name;

注意事项

  • bitmap 索引仅在单列上创建。
  • bitmap 索引能够应用在 DuplicateUniq 数据模型的所有列和 Aggregate模型的key列上。
  • bitmap 索引支持的数据类型如下:
    • TINYINT
    • SMALLINT
    • INT
    • BIGINT
    • CHAR
    • VARCHAR
    • DATE
    • DATETIME
    • LARGEINT
    • DECIMAL
    • BOOL
  • bitmap索引仅在 Segment V2 下生效。当创建 index 时,表的存储格式将默认转换为 V2 格式。

参考: 官网 https://doris.apache.org/zh-CN/docs/dev/data-table/index/index-overview

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、付费专栏及课程。

余额充值