StarRocks主键模型原理与应用
请详细说明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 Key | StarRocks Primary Key |
|---|---|---|
| 存储方式 | Merge-on-Read | Delete+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类型