流式数据湖Paimon探秘之旅 (十二) 索引与加速

第12章:索引与加速

导言:加快查询速度的利器

在前面的章节中,我们讲了文件选择、谓词下推等优化手段。但有时候文件太多,统计信息不够精准 ,这时就需要索引来加速查询。


第一部分:Deletion Vector(删除向量)

1.1 什么是删除向量

在主键表中,DELETE操作会创建删除标记,而不是立即删除数据:

ini 复制代码
原始文件:
File_1.parquet
├─ Row 0: key=1, value="Alice"
├─ Row 1: key=2, value="Bob"
├─ Row 2: key=3, value="Charlie"
└─ Row 3: key=4, value="David"

删除操作:DELETE WHERE key=2 或 key=3

使用删除向量标记哪些行被删除:
Deletion Vector: [0, 1, 1, 0]
(第1和2行被标记删除)

读取时:
会跳过被标记的行,只返回:
key=1, value="Alice"
key=4, value="David"

1.2 删除向量的优势

sql 复制代码
传统做法(重写文件):
DELETE → 需要重写整个文件,很大的开销

删除向量(Bitmap标记):
DELETE → 仅添加一个小的DV文件(几KB)
         ↓
         加速查询(跳过被标记行)

对比:
├─ 删除向量:开销低(<1%),查询快(减少不必要的行)
└─ 重写文件:开销高(100%),必须重新处理所有行

1.3 启用删除向量

yaml 复制代码
CREATE TABLE orders (
    order_id BIGINT PRIMARY KEY,
    status STRING,
    ...
) WITH (
    'deletion-vectors.enabled' = 'true'
);

配置影响:
├─ 查询性能:提升5-20%(避免读已删除行)
├─ 存储开销:增加<1%(仅DV文件)
├─ 适用:频繁DELETE的表
└─ 不适用:纯追加表(没有DELETE)

第二部分:文件统计信息

2.1 统计的字段类型

每个文件都维护关键字段的统计:

arduino 复制代码
file_1.parquet
├─ 行数:1000000
├─ 文件大小:128MB
├─ 字段统计:
│   ├─ order_id: min=1, max=1000000, null_count=0
│   ├─ amount: min=10.5, max=9999.99, null_count=100
│   └─ created_at: min=1704067200, max=1704153600, null_count=0
└─ 写入时间:2024-01-01 12:00:00

2.2 使用统计信息进行文件剪枝

arduino 复制代码
查询:SELECT * FROM orders WHERE amount > 5000

文件扫描:
├─ file_1.parquet: min=10.5, max=9999.99
│   → 可能有匹配(max > 5000),保留
├─ file_2.parquet: min=100, max=500
│   → 全部 < 5000,完全排除 ✓
└─ file_3.parquet: min=5010, max=8000
   → 完全匹配(min > 5000),保留

结果:仅读2个文件而不是3个

第三部分:Bloom Filter

3.1 布隆过滤器的原理

ini 复制代码
场景:快速判断一个值是否在集合中

布隆过滤器:
├─ 占用空间小(几KB)
├─ 查询快(O(1))
└─ 可能有假阳性(false positive)但无假阴性

例子:
file_1.parquet 的 key = {1, 3, 5, 7, 9, ...}
  ↓
构建Bloom Filter
  ↓
查询:key=5?
  → 在过滤器中 ✓(可能在文件中)
  ↓
查询:key=6?
  → 不在过滤器中 ✓(肯定不在文件中)

3.2 启用Bloom Filter索引

yaml 复制代码
CREATE TABLE orders (
    order_id BIGINT PRIMARY KEY,
    ...
) WITH (
    'file-index.bloom-filter.enabled' = 'true',
    'file-index.bloom-filter.columns' = 'order_id,user_id'
);

效果:
├─ 点查性能:提升30-50%
├─ 范围扫描:无帮助
└─ 存储开销:+2-5%

第四部分:Metaindex(元索引)

4.1 Metaindex是什么

Metaindex是一个轻量级的索引,记录文件范围:

yaml 复制代码
表有1000个文件,需要查询 order_id=12345 的记录

不用Metaindex:
└─ 逐个检查1000个文件 → 1000次操作

使用Metaindex:
├─ Metaindex记录:
│   file_1: key range 1-1000
│   file_2: key range 1001-2000
│   ...
│   file_13: key range 12001-13000  ← 目标在这里
│   ...
│   file_1000: key range 999001-1000000
│
└─ 直接定位到file_13 → 1次操作!

加速:1000倍!

4.2 启用Metaindex

yaml 复制代码
CREATE TABLE orders (
    order_id BIGINT PRIMARY KEY,
    ...
) WITH (
    'file-index.metaindex.enabled' = 'true'
);

内存占用:O(文件数量)
每个文件记录:~100字节

对于10万文件:
└─ Metaindex大小:~10MB(可完全缓存)

查询加速:
└─ 从O(文件数)降到O(log 文件数)

第五部分:生产级配置

5.1 OLTP场景(在线事务,频繁更新和点查)

yaml 复制代码
CREATE TABLE users (
    user_id BIGINT PRIMARY KEY,
    email STRING,
    phone STRING,
    ...
) WITH (
    'deletion-vectors.enabled' = 'true',
    'file-index.metaindex.enabled' = 'true',
    'file-index.bloom-filter.enabled' = 'true',
    'file-index.bloom-filter.columns' = 'user_id,email'
);

配置说明:
├─ DV:处理DELETE
├─ Metaindex:加速点查(通过key定位文件)
├─ Bloom Filter:排除不相关文件
└─ 预期:点查延迟<50ms

5.2 OLAP场景(分析查询,范围扫描)

yaml 复制代码
CREATE TABLE sales (
    date DATE,
    region STRING,
    amount DECIMAL,
    ...
) WITH (
    'deletion-vectors.enabled' = 'false',  # 无DELETE
    'file-index.metaindex.enabled' = 'true',
    'file-index.bloom-filter.enabled' = 'false'  # 范围扫描无用
);

配置说明:
├─ 不启用DV(无DELETE操作)
├─ Metaindex:辅助分区剪枝
└─ 不启用Bloom Filter(对范围扫描无帮助)

总结

索引的性能收益

索引类型 场景 加速倍数 开销
删除向量 频繁DELETE 5-20% <1%
统计信息 谓词过滤 30-50% 0%
Bloom Filter 点查 30-50% 2-5%
Metaindex 大表点查 10-100倍 0.01%

配置checklist

  • 根据表大小启用Metaindex
  • 对于有DELETE的表启用DV
  • 对于OLTP场景启用Bloom Filter
  • 定期分析索引效果,调整配置

下一章:第13章讲解分区与过期管理!

相关推荐
Guheyunyi5 小时前
智能守护:视频安全监测系统的演进与未来
大数据·人工智能·科技·安全·信息可视化
发哥来了6 小时前
主流AI视频生成商用方案选型评测:五大核心维度对比分析
大数据·人工智能
数研小生6 小时前
做京东评论分析系统11年,京东评论数据接口解析
大数据
金融小师妹7 小时前
基于LSTM-GARCH-EVT混合模型的贵金属极端波动解析:黄金白银双双反弹的逻辑验证
大数据·人工智能·深度学习·机器学习
yumgpkpm8 小时前
2026软件:白嫖,开源,外包,招标,晚进场(2025年下半年),数科,AI...中国的企业软件产业出路
大数据·人工智能·hadoop·算法·kafka·开源·cloudera
xixixi777779 小时前
今日 AI 、通信、安全行业前沿日报(2026 年 2 月 4 日,星期三)
大数据·人工智能·安全·ai·大模型·通信·卫星通信
珠海西格10 小时前
1MW光伏项目“四可”装置改造:逆变器兼容性评估方法详解
大数据·运维·服务器·云计算·能源
迎仔11 小时前
13-云原生大数据架构介绍:大数据世界的“弹性城市”
大数据·云原生·架构
产品人卫朋11 小时前
卫朋:IPD流程落地 - 市场地图拆解篇
大数据·人工智能·物联网
TDengine (老段)11 小时前
通过云服务 快速体验 TDengine
大数据·数据库·物联网·时序数据库·tdengine·涛思数据·iotdb