基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Doris的常见索引有哪些?

Apache Doris 是一款高性能的实时 OLAP 数据库,为了在海量数据下实现毫秒级的查询响应,它提供了极其丰富的索引机制。Doris 的索引主要可以分为两类:内置的智能索引(Smart Index)用户手动创建的二级索引(Secondary Index)

以下是 Doris 中常见的索引及其适用场景:


一、 内置智能索引(系统自动生成,无需手动创建)

这部分索引是 Doris 在数据写入时自动构建的,用户无需显式使用 CREATE INDEX 语法,但需要合理设计建表时的列顺序

1. 前缀索引 (Prefix Index / Short Key Index)

  • 原理:Doris 的数据是按建表时指定的排序列(Key 列)有序存储的。Doris 会在有序数据的基础上,每隔一定的行数(通常是 1024 行)提取一次 Key 列的值作为稀疏索引。默认取前 36 个字节作为前缀索引。
  • 适用场景:适用于对排序列(通常是主键或维度列)进行 =, <, >, BETWEEN 等范围或等值查询。
  • 优化建议:建表时,将查询中最常用于过滤条件(WHERE)的列放在表结构的最前面。

2. 区间索引 (Zone Map Index)

  • 原理:Doris 自动为表中的每一列(无论是 Key 还是 Value 列)维护了 Zone Map 索引。它记录了数据块(Page 和 Segment 级别)中该列的 最大值 (Max)最小值 (Min)是否有 NULL 值 (HasNull) 等统计信息。
  • 适用场景:当查询条件包含 =, <, >, BETWEEN 时,Doris 会根据 Zone Map 的 Min/Max 值快速跳过不包含目标值的数据块,极大地减少 IO。对数值型、日期型的范围过滤尤其有效。

二、 手动创建的二级索引(按需创建)

当查询条件不包含前缀索引的列,或者需要对复杂的文本、高基数/低基数列进行加速时,可以手动创建以下索引。

1. 布隆过滤器索引 (Bloom Filter Index)

  • 原理:基于 Bloom Filter 算法,能够快速判断一个值“绝对不存在”“可能存在”。占用空间极小。
  • 适用场景
    • 适用于高基数(Distinct 值非常多)的列,如:UUID身份证号手机号订单号 等。
    • 仅支持等值查询(=)和 IN 查询,不支持范围或 LIKE 查询。
  • 创建语法:建表时在 PROPERTIES 中指定 "bloom_filter_columns" = "col1, col2"

2. 位图索引 (Bitmap Index)

  • 原理:将列中的每一个具体的值映射为一个 Bitmap(位图),位图中的每一位代表一行数据,1 表示存在,0 表示不存在。Doris 内部使用了 Roaring Bitmap 进行压缩。
  • 适用场景
    • 适用于低、中基数(Distinct 值较少,一般在几万以内)的列,如:性别城市省份状态 等。
    • 非常擅长多列组合过滤条件(AND, OR),因为可以通过位图的交集、并集运算极速得出结果。
  • 创建语法CREATE INDEX idx_name ON table_name(col_name) USING BITMAP;

3. 倒排索引 (Inverted Index) —— Doris 2.0 后的杀手锏

  • 原理:类似 Elasticsearch 的底层机制,将文本/数据拆解为词条(Term),并记录包含该词条的行号(RowID)列表。Doris 的倒排索引不仅支持文本分词,还支持对数值、日期等类型建立倒排。
  • 适用场景
    • 全文检索:支持对字符串进行分词,使用 MATCH_ANY, MATCH_ALL, MATCH_PHRASE 等进行复杂的文本搜索。
    • 加速 LIKE 查询:普通 LIKE '%keyword%' 扫全表很慢,倒排索引可以极大加速。
    • 数组/JSON 检索:支持对 Array 嵌套结构建立索引。
    • 替代 Bitmap/Bloom Filter:在 Doris 2.0+ 中,数值类型的倒排索引性能极高,很多场景下可以平替 Bitmap 索引进行多维分析。
  • 创建语法CREATE INDEX idx_name ON table_name(col_name) USING INVERTED PROPERTIES("parser" = "english");

4. N-Gram 布隆过滤器索引 (N-Gram Bloom Filter Index)

  • 原理:将字符串按 N 个字符滑动切分,并将切分后的子串放入 Bloom Filter 中。
  • 适用场景:专用于加速字符串的 LIKE 模糊匹配查询。
  • (注:在 Doris 2.0 引入强大的倒排索引后,N-Gram 索引的使用场景正在被倒排索引逐渐取代,因为倒排索引性能更好且功能更全。)

三、 总结:如何选择合适的索引?

在实际业务中,可以参考以下决策树来选择 Doris 索引:

  1. 查询是最核心的维度(如时间、租户ID) \rightarrow 建表时将其放在前面,利用默认的 前缀索引 (Prefix Index)Zone Map
  2. 查询是低基数的枚举值(如性别、状态) \rightarrow 创建 位图索引 (Bitmap Index)
  3. 查询是高基数的精确匹配(如订单号 = 'xxx') \rightarrow 创建 布隆过滤器 (Bloom Filter Index)
  4. 查询包含文本模糊匹配(LIKE)、全文检索(MATCH)或多维复杂组合条件 \rightarrow 创建 倒排索引 (Inverted Index)

(补充说明:如果现有的排序列完全无法满足新的高频查询模式,在 Doris 中还可以通过建立 物化视图 (Materialized View) / Rollup,通过改变数据的排序方式来生成新的前缀索引,这在广义上也是一种“索引”手段。)

00:00
00:00