Doris 中主键模型的读时合并模式

好的,我们来详细解释 Doris 中主键模型的 读时合并(Read-Computing Merge) 模式。这是一种高效处理数据更新的机制,特别适用于需要支持主键更新且对查询性能要求高的场景。

在 1.2 版本前,Doris 中的主键模型默认使用读时合并模式,数据在写入时并不进行合并,以增量的方式被追加存储,在 Doris 内保留多个版本。查询 时,会对数据进行相同 Key 的版本合并。读时合并适合写多读少的场景,在查询是需要进行多个版本合并。

📌 核心概念

在 Doris 的主键模型中,读时合并模式的核心思想是:

  • 写入时分离:当新数据写入时,系统并不立即覆盖旧数据,而是将新数据存储在增量存储区(如 Rowset Delta)。
  • 查询时合并:当查询请求到达时,系统在内存中动态地将基础数据(Base)与增量数据(Delta)进行合并,生成最新的数据视图供查询使用。

🔧 工作原理

  1. 数据写入流程

假设原始数据为:

主键 (id) 列 A 列 B
1 A1 B1
2 A2 B2

当新数据写入(如更新 id=1):

复制代码
UPDATE table SET colA = 'A1_new' WHERE id = 1;

系统会将更新记录写入增量存储区:

主键 (id) 列 A 列 B 版本号 (version)
1 A1_new NULL 2

注:未更新的列(如 colB)通常标记为 NULL 以节省空间。

  1. 查询合并流程

当查询请求到达时(如 SELECT * FROM table WHERE id = 1),系统执行以下合并逻辑:

  • 定位数据 :在基础数据中找到 id=1 的记录 (A1, B1)
  • 合并增量 :在增量存储区找到最新版本(如 version=2)的记录 (A1_new, NULL)
  • 动态合并 :生成最终结果:

    \\text{colA} = \\text{A1_new}, \\quad \\text{colB} = \\text{B1}

⚡ 性能优势

  1. 写入高效

    • 增量写入避免全量覆盖,减少 I/O 压力。
    • 支持高并发写入(如 Kafka 流式写入)。
  2. 查询优化

    • 通过向量化计算加速合并过程(示例伪代码):

      复制代码
      def mergeRow(base: Row, delta: Row): Row = {
        val merged = new Row()
        for (column in columns) {
          merged(column) = delta.getOrNull(column) ?? base(column)
        }
        merged
      }
    • 利用索引快速定位数据(如主键索引)。

  3. 空间与时效平衡

    • 后台异步合并任务(Compaction)定期将增量数据合并到基础数据中,避免增量数据无限增长。

🚫 使用限制

  • 内存压力:大量增量数据可能导致查询时内存占用升高。
  • 版本管理:需合理设计版本清理策略(如按时间保留最近 N 个版本)。

💎 总结

读时合并模式通过写入轻量化 + 查询时动态计算,在保证主键唯一性的同时,显著提升了高并发更新场景下的系统吞吐量。其核心价值在于: $$ \text{性能} \propto \frac{\text{写入效率}}{\text{查询延迟}} $$ 适合实时数仓、频繁更新的业务表(如用户画像、交易订单)等场景。

相关推荐
2301_8002561115 小时前
第九章:空间网络模型(空间网络查询、数据模型、Connected、with Recursive、pgRouting)
网络·数据库·算法·postgresql·oracle
霖霖总总16 小时前
[小技巧19]MySQL 权限管理全指南:用户、角色、授权与安全实践
数据库·mysql·安全
heartbeat..20 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
麦聪聊数据1 天前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
AC赳赳老秦1 天前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
YMatrix 官方技术社区1 天前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix
辞砚技术录1 天前
MySQL面试题——索引2nd
数据库·mysql·面试
linweidong1 天前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
欧亚学术1 天前
突发!刚刚新增17本期刊被剔除!
数据库·论文·sci·期刊·博士·scopus·发表
黑白极客1 天前
怎么给字符串字段加索引?日志系统 一条更新语句是怎么执行的
java·数据库·sql·mysql·引擎