索引优化:前缀索引与倒排索引使用技巧
概述
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 Bloomfilter | LIKE 模糊匹配 | 否 | 否(增量生效) | 字符串 |
| 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。
合理利用这些索引,可显著提升多场景下的业务查询和分析速度。建议优先评估业务高频过滤字段,再结合表是否可重建、数据量大小等因素选择合适的索引类型。