Doris专题22- 数据更新-概述
1. 核心概念:表模型与更新机制
Apache Doris 提供三种表模型,分别适用于不同的业务场景和更新需求。
1.1. 表模型概览
表模型 | 主要特点 | 更新能力 | 适用场景 |
---|---|---|---|
主键模型 | 支持行级 UPSERT 和部分列更新 | 最强,支持所有更新和删除方式 | 订单状态更新、用户标签实时计算、CDC 数据同步 |
聚合模型 | 按 Key 列预聚合,Value 列按聚合函数合并 | 有限,支持 REPLACE 式更新和删除 | 实时报表、广告点击统计 |
明细模型 | 仅追加写入,不进行去重或聚合 | 有限,仅支持条件删除 | 日志采集、用户行为埋点 |
1.2. 数据更新方式
1.2.1. 通过导入进行更新(UPSERT)
- 所有导入方式(Stream Load、Broker Load、Routine Load、INSERT INTO)均支持 UPSERT。
- 主键存在则覆盖,不存在则插入。
1.2.2. 通过 UPDATE DML 语句更新
- 支持标准 SQL UPDATE 语法,适用于低频、批量更新。
示例:
UPDATE user_profiles SET age = age + 1 WHERE user_id = 1;
1.2.3. 通过 INSERT INTO SELECT 更新
- 利用 UPSERT 语义实现类似 UPDATE 的效果。
1.3. 数据删除方式
1.3.1. 通过导入进行标记删除
- 使用隐藏列
__DORIS_DELETE_SIGN__
标记删除。
示例 JSON 导入数据:
{"user_id": 2,"__DORIS_DELETE_SIGN__": "1"
}
1.3.2. 通过 DELETE DML 语句删除
- 支持标准 SQL DELETE 语法。
示例:
DELETE FROM user_profiles WHERE last_login < '2022-01-01';
2. 深入主键模型:原理与实现
2.1. Merge-on-Write (MoW) vs. Merge-on-Read (MoR)
特性 | Merge-on-Write (MoW) | Merge-on-Read (MoR) |
---|---|---|
核心思想 | 写入时合并,存储中每个主键仅一条最新记录 | 查询时合并,存储多个版本 |
查询性能 | 极高 | 较差(3-10 倍延迟) |
写入性能 | 有一定性能损失 | 写入速度快 |
适用场景 | 读多写少,实时分析场景 | 写多读少(已不推荐) |
2.2. 条件更新(Sequence Column)
- 用于处理乱序数据,保证最终一致性。
建表示例:
CREATE TABLE order_status (order_id BIGINT,status_name STRING,update_time DATETIME
)
UNIQUE KEY(order_id)
DISTRIBUTED BY HASH(order_id)
PROPERTIES ("function_column.sequence_col" = "update_time"
);
2.3. 删除机制(DORIS_DELETE_SIGN)
2.4. 部分列更新(Partial Column Update)
- 仅更新指定列,未提供列保持原值。
建表并启用部分列更新:
CREATE TABLE user_profiles (user_id BIGINT,name STRING,age INT,last_login DATETIME
)
UNIQUE KEY(user_id)
DISTRIBUTED BY HASH(user_id)
PROPERTIES ("enable_unique_key_partial_update" = "true"
);
更新示例:
{"user_id": 1,"age": 31,"last_login": "2023-10-26 18:00:00"
}
注意: 部分列更新存在“读放大”和“写放大”,建议使用 SSD 硬盘并开启行存以减少随机 IO。
3. 典型应用场景
3.1. CDC 数据实时同步
- 使用 Flink CDC 捕获 Binlog,实时写入 Doris 主键表。
- 支持整库同步,保证数据一致性。
3.2. 实时宽表拼接
- 利用部分列更新,将多源数据流实时写入同一张宽表。
- 每个数据流仅更新相关字段,减少 I/O 开销。
4. 最佳实践
4.1. 通用性能实践
- 优先使用导入更新(如 Stream Load)而非 UPDATE 语句。
- 批量写入,避免高频单条 INSERT。
- 谨慎使用高频 DELETE,尤其在明细/聚合模型中。
- 使用
TRUNCATE PARTITION
删除整个分区数据。 - 串行执行 UPDATE,避免并发冲突。
4.2. 存算分离架构下的主键模型实践
- 控制单表导入频率 ≤ 60次/秒。
- 合理设计分区(时间分区)和分桶(8-64 个 Tablet)。
- 调整 Compaction 策略以减少锁竞争。