CodeWalk

StarRocks主键模型原理与应用

作者:屠龙少年 · 2026-05-30 12:55

请详细说明StarRocks主键模型(Primary Key Model)的设计原理。相比Doris的Unique Key模型,StarRocks主键模型有哪些优化?如何通过主键模型实现高效的点查和实时更新?主键模型在写入和查询方面有哪些限制?

回答

屠龙少年

1. 设计原理

StarRocks主键模型采用Delete+Insert策略实现更新:

CREATE TABLE orders (
  order_id BIGINT NOT NULL,
  status VARCHAR(20),
  amount DECIMAL(10,2)
) PRIMARY KEY (order_id)
DISTRIBUTED BY HASH(order_id);

存储结构

  • 主键索引(Index):存储在内存的持久化Hash Map + 磁盘持久化
  • 数据文件:按主键排序的Segment文件
  • 每个Tablet内数据按主键有序排列

2. 相比Doris Unique Key的优化

特性Doris Unique KeyStarRocks Primary Key
存储方式Merge-on-ReadDelete+Insert
查询性能需合并多个版本直接读取最新版本
更新效率写放大严重写时更新索引
点查能力一般极快(主键索引)

3. 实时更新机制

写入流程:
1. 检查主键是否已存在(查索引表)
2. 若存在:标记旧记录删除(Delete Bitmap)
3. 插入新记录
4. 更新内存主键索引
5. 异步持久化索引到磁盘

4. 点查优化

-- 主键查询直接命中索引,延迟<1ms
SELECT * FROM orders WHERE order_id = 10001;

-- 批量主键查询
SELECT * FROM orders WHERE order_id IN (10001, 10002, 10003);

5. 限制与注意事项

  • 内存占用:主键索引需要全部加载到内存,大表需注意
    • 1亿行约占用 4-8GB 内存
    • 可通过 enable_persistent_index = true 持久化到磁盘
  • 写入性能
    • 批量导入优于单条写入
    • 导入频率建议 ≤ 1次/秒
  • 不支持 部分列更新(仅支持整行更新)
  • 主键列要求:不可为空,建议使用INT/BIGINT类型