当前位置: 首页 > news >正文

StarRocks 各类索引以及存储位置详解

StarRocks 支持多种索引机制,不同索引根据其功能和设计目标,存储在不同的层级和位置。以下是 主键索引、前缀索引、Ordinal 索引、ZoneMap 索引、Bloom Filter、Bitmap 索引 的详细存储位置对比。


结论

索引类型存储位置存储层级是否独立文件是否可持久化
主键索引 (Primary Key Index)persistent_index/ 目录下的 .pkindex 文件Tablet 级(全局)✅ 独立✅ 是(推荐)
前缀索引 (Prefix Index)segment_xxx.idx 文件Segment 级✅ 附属文件✅ 是
Ordinal 索引内嵌于 .idx 文件或段元数据中Segment 级❌ 否(内嵌)✅ 是
ZoneMap 索引segment_xxx.idx 文件(与前缀索引共存)Segment 级✅ 附属文件✅ 是
Bloom Filter 索引col_<column>.bloom 文件Segment 级✅ 附属文件✅ 是
Bitmap 索引col_<column>.bitmap 文件Segment 级✅ 附属文件✅ 是

📌 所有索引在查询时均可加载到 BE 内存缓存 中以加速访问。


详细存储结构图

/starrocks/be/storage/data/0/<tablet_id>/

├── persistent_index/ ← 主键索引(独立全局)
│ └── primary_key.pkindex → RocksDB 格式,存储主键 → (RowSet, Segment, row_id) 映射

├── rowset_12345/ ← RowSet 1
│ ├── segment_001.dat → 数据文件
│ ├── segment_001.idx → 前缀索引 + ZoneMap + Ordinal 索引 ✅
│ ├── col_user_id.bloom → Bloom Filter ✅
│ └── col_status.bitmap → Bitmap 索引 ✅

├── rowset_67890/ ← RowSet 2
│ ├── segment_002.dat
│ ├── segment_002.idx → 前缀索引 + ZoneMap + Ordinal 索引 ✅
│ ├── col_user_id.bloom → Bloom Filter ✅
│ └── col_gender.bitmap → Bitmap 索引 ✅


🔍 各类索引存储详解

1. 主键索引 (Primary Key Index)

  • 存储位置
    • ✅ 独立目录:/starrocks/be/storage/data/0/<tablet_id>/persistent_index/
    • ✅ 文件名:primary_key.pkindex(RocksDB SSTables)
  • 存储层级Tablet 级,覆盖所有 RowSet 和 Segment。
  • 是否独立:✅ 是,不依赖任何 RowSet 或 Segment。
  • 持久化
    • 必须启用:"enable_persistent_index" = "true"
    • 重启后无需重建,保障高可用。
  • 内容:主键值 → (RowSet ID, Segment ID, 行号) 的映射。

💡 作用:支持 UPSERTDELETE,实现行级更新。


2. 前缀索引 (Prefix Index / ZoneMap)

  • 存储位置
    • ✅ 每个 Segment 一个文件:segment_xxx.idx
    • .dat 文件同目录。
  • 存储层级Segment 级
  • 是否独立:❌ 否,是 Segment 的附属索引文件。
  • 持久化:✅ 是,随 Segment 持久化。
  • 内容:每 1024 行的 min/max 值,用于数据块剪枝。

💡 作用:加速 WHERE col > 100 类范围查询,减少扫描量。
在实现上,可以作用于一个 Segment,也可以是一个列的一个 Data Page,相应的 ZoneMap 索引有两种:一种是存每个 Segment 的统计信息,另一种是存每个 Data Page 的统计信息


3. Bloom Filter 索引

  • 存储位置
    • ✅ 每个启用了 BF 的列一个文件:col_<column_name>.bloom
    • 与 Segment 文件同目录。
  • 存储层级Segment 级
  • 是否独立:❌ 否,是列的附属索引。
  • 持久化:✅ 是。
  • 内容:列中所有值的哈希指纹(位数组),用于快速判断“某值是否存在”。

💡 作用:加速 WHERE user_id = '123' 类等值查询,避免无效 I/O。


4. Bitmap 索引

  • 存储位置
    • ✅ 每个启用了 Bitmap 的列一个文件:col_<column_name>.bitmap
    • 与 Segment 文件同目录。
  • 存储层级Segment 级
  • 是否独立:❌ 否。
  • 持久化:✅ 是。
  • 内容:低基数列(如 status, gender)的位图映射,支持 IN= 查询的位运算。

💡 作用:高效处理 WHERE status IN ('PENDING', 'DONE') 类查询。


🔄 查询时的内存加载情况

索引类型内存加载行为
主键索引常驻内存或缓存热数据
前缀索引查询时加载到 Index Cache,常驻内存
Bloom Filter查询时加载,高频列常驻内存
Bitmap 索引查询时加载

⚠️ 主键索引内存占用较大,需根据主键列大小和行数规划 BE 内存。


如何配置和查看?

1. 建表时启用索引

CREATE TABLE user_table (user_id BIGINT status VARCHAR(20),gender VARCHAR(10),visit_time DATETIME,...
) 
PRIMARY KEY (user_id)
DISTRIBUTED BY HASH(user_id)
PROPERTIES ("enable_persistent_index" = "true",              -- 主键索引持久化"bloom_filter_columns" = "user_id",              -- Bloom Filter"bitmap_columns" = "status,gender"               -- Bitmap 索引
);
http://www.dtcms.com/a/394698.html

相关文章:

  • PromptPilot 技术深解,工程化提示词开发如何让大模型准确率大大提高
  • RTX4090:AI与深度学习应用实践的革命性推动者
  • Cursor Multi-Root Workspace 新特性深度实战:一次打开 React 前端 + Go 后端,AI 自动跨项目跳转、联调、写代码!
  • 如何处理单位换算的问题
  • Docker部署 MySQL+Mycat
  • RTX4090:极致性能探索与硬核评测
  • DM物理存储结构及内存结构
  • ASP.NET Core MVC 路由逻辑初探
  • 【Python办公】文字转视频(可自定义颜色、字体大小)
  • 数据洪流时代,如何挑选一款面向未来的时序数据库?IoTDB 的答案
  • python+django/flask的吉安红色旅游平台 红色教育景区展示+图文资讯发布+评论互动功能系统java+nodejs
  • 设计模式(C++)详解——代理模式 (Proxy Pattern)(2)
  • 详解 Kubernetes 命令:kubectl exec -it nginx -- bash 及实战场景
  • Android挂机短信模板和多台手机同步短信模板
  • Solid Edge 转换为 IGS 全流程技术指南:含迪威模型网在线转换方案
  • 设计模式(C++)详解——代理模式 (Proxy Pattern)(1)
  • 聊聊AI agents MCP 开发
  • 【C++进阶】智能指针的使用及其原理
  • 极客天成让统一存储从云原生‘进化’到 AI 原生: 不是版本升级,而是基因重组
  • 【JavaScript 性能优化实战】第五篇:运行时性能优化进阶(懒加载 + 预加载 + 资源优先级)
  • Java基础(十二):抽象类与接口详解
  • 使用《微PE》软件,制作U盘启动盘(PE工具盘)
  • 《初阶 Linux 工具学习:Shell运行原理以及Linux权限讲解》
  • 树链剖分(模板 + 思路)
  • 医疗数据互操作性与联邦学习的python编程方向研究(上)
  • Windows最新摆烂更新,让用户没法看视频了
  • 可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
  • Permute 媒体文件格式转换【音视频图像文件转换】(Mac电脑)
  • Netty:实现RPC服务(实战)
  • 408复习笔记—MIPS指令系统