跳到主要内容

索引优化:前缀索引与倒排索引使用技巧

概述

Doris 索引是用于加速查询过滤的数据结构。合理使用索引可显著提升查询性能。

Doris 目前支持两类索引:

索引类别包含类型特点
内置索引前缀索引、ZoneMap 索引建表时自动生成,无需额外维护
二级索引倒排索引、Bloomfilter 索引、N-Gram Bloomfilter 索引、Bitmap 索引用户按需创建,可独立管理

在业务优化过程中,结合业务特征有效利用索引,可大幅提升查询和分析效果,是性能调优的关键手段之一。

各类索引的详细介绍可参考表索引章节。本文从实际案例出发,介绍几种典型场景下的索引使用技巧并给出优化建议。

阅读前自检 Checklist

  • 已了解当前表的 Key 列定义及顺序
  • 已识别业务高频过滤字段
  • 已评估是否可以重建表或仅追加二级索引
  • 已掌握不同索引类型的适用场景

案例 1:调整 Key 列顺序,利用前缀索引加速查询

优化表 Schema 设计中,已介绍了如何选择合适的字段作为 Key 字段,并利用 Doris 的 Key 列排序特性加速查询。本案例进一步扩展该场景。

背景

Doris 内置前缀索引:建表时自动取表 Key 的前 36 字节作为前缀索引。当查询条件与前缀索引的前缀相匹配时,可显著加快查询速度。

问题:Key 列顺序与查询模式不匹配

原始建表语句如下:

CREATE TABLE `t1` (
`c1` VARCHAR(10) NULL,
`c2` VARCHAR(10) NULL
) ENGINE=OLAP
DUPLICATE KEY(`c1`)
DISTRIBUTED BY HASH(`c2`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

对应的业务 SQL 模式如下:

select * from t1 where t1.c2 = '1';
select * from t1 where t1.c2 in ('1', '2', '3');

上述 Schema 中 c1 在前、c2 在后,但查询使用 c2 字段过滤。在这种情况下,无法利用前缀索引的加速能力。

优化方案:调整列顺序

c2 列置于第一个字段位置,使前缀索引覆盖业务过滤条件:

CREATE TABLE `t1` (
`c2` VARCHAR(10) NULL,
`c1` VARCHAR(10) NULL
) ENGINE=OLAP
DUPLICATE KEY(`c2`)
DISTRIBUTED BY HASH(`c1`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
优化提示

在定义 Schema 列顺序时,应参考业务查询过滤中的高频高优列,以充分利用 Doris 的前缀索引加速能力。

案例 2:使用倒排索引加速查询

适用场景

Doris 支持倒排索引作为二级索引,用于加速以下业务场景:

  • 文本类型的全文检索;
  • 字符串、数值、日期时间字段上的等值查询;
  • 字符串、数值、日期时间字段上的范围查询。

优势

倒排索引的创建和管理是独立的:在不影响原始表 Schema、且无需重新导入表数据的前提下,即可便捷优化业务性能。

关于典型使用场景、语法及案例,可参考倒排索引,本章节不再重复阐述。

优化建议

当原始表结构和 Key 定义不便优化、或重新导入数据成本较高时,倒排索引提供了一种灵活的加速方案,用于优化业务执行性能。

索引选型对比

索引类型适用查询是否需要重建表是否需要重新导入数据典型字段类型
前缀索引等值、范围、前缀匹配是(调整 Key)排序在前的 Key 列
ZoneMap 索引范围过滤否(自动)所有列
倒排索引全文检索、等值、范围字符串、数值、日期时间
Bloomfilter 索引高基数等值过滤否(增量生效)字符串、数值
N-Gram BloomfilterLIKE 模糊匹配否(增量生效)字符串
Bitmap 索引低基数等值过滤否(增量生效)枚举型字段

FAQ 与常见问题

Q1:为什么我建了索引,查询还是慢?

可能原因:

  • 查询条件未命中索引列;
  • Key 列顺序与过滤条件不匹配,前缀索引未生效;
  • 数据量较小,索引未带来明显收益;
  • 索引尚未在历史数据上生效(部分二级索引仅对新写入数据立即生效)。

Q2:前缀索引是否需要手动创建?

不需要。建表时 Doris 会自动取 Key 列的前 36 字节作为前缀索引。要让前缀索引生效,需将业务高频过滤字段排在 Key 列前部。

Q3:倒排索引和 Bloomfilter 索引如何选择?

  • 全文检索、模糊匹配、范围查询:优先选择倒排索引;
  • 高基数字段的精确等值查询:可选择 Bloomfilter 索引,开销更低。

Q4:调整 Key 列顺序需要重建表吗?

是。Key 列顺序属于表 Schema 定义的一部分,调整后需重建表并重新导入数据。

总结

在 Schema 调优中,索引优化与表级 Schema 优化同样重要。Doris 提供了多种索引类型:

  • 内置索引:前缀索引、ZoneMap 索引;
  • 二级索引:倒排索引、Bloomfilter、N-Gram Bloomfilter、Bitmap。

合理利用这些索引,可显著提升多场景下的业务查询和分析速度。建议优先评估业务高频过滤字段,再结合表是否可重建、数据量大小等因素选择合适的索引类型。