ClickHouse轻量级更新实测:批量写入快1700倍,OLAP数据库也能高效修改数据

提到分析型数据库(OLAP),人们的第一印象往往是”只读”——擅长海量数据的聚合分析,但更新和删除操作是噩梦。传统观点认为,列式存储的Immutable设计决定了它不适合频繁修改数据。然而,ClickHouse在2025年用一项技术创新打破了这一刻板印象:轻量级更新(Lightweight Updates)将数据修改性能提升了1700倍,让分析型数据库也能支持实时数据写入和更新。

为什么OLAP数据库害怕更新

要理解ClickHouse的突破,先要理解问题的本质。

传统的OLTP数据库(如MySQL、PostgreSQL)是行式存储,记录一行存一次,改一个字段只需原地更新那一小块数据,成本很低。但这种架构在做大规模分析时很痛苦——读10万条数据可能需要把不相关的几百个字段也加载进内存。

ClickHouse代表的OLAP数据库走了完全相反的路:列式存储 + Immutable数据文件。数据写入后变成不可变的”数据块”(data parts),不同列分别存成独立的压缩文件。这种架构让读取时只加载需要的列,聚合查询极快——每秒能处理数十亿行。

但代价来了:改数据变成了灾难。因为文件Immutable,想改一行数据?对不起,整个文件重写。删除一行?一样要重写。传统上ClickHouse的ALTER TABLE ... UPDATE被称为”重量级mutation”,执行时需要:

  • 标记所有涉及的目标行所在的数据块
  • 重新写入所有列数据(排除要修改的行)
  • 在后台合并完成前,数据对查询不可见
  • 这种架构对于”一次写入、多次读取”的日志分析场景很完美,但对于需要实时更新的业务(比如电商库存、金融交易状态、用户画像)来说几乎是不可用的。

    Patch Part架构:重新设计更新机制

    ClickHouse的解决方案是引入Patch Part(补丁文件)架构,原理类似Linux的增量补丁:

    Patch Part 工作原理(ClickHouse 官方架构图)

  • 不重写原始数据:当执行UPDATE时,ClickHouse只创建一个小型”补丁文件”,记录两件事:哪一行被修改了(通过_block_number和_block_offset定位),以及新的值是什么
  • 逻辑删除更轻量:DELETE操作使用_row_exists逻辑掩码,把对应行的标记从1改为0。查询时自动过滤标记为0的行,实现”下一条查询即可见”
  • 后台合并时应用:补丁在ClickHouse定期的后台合并过程中自动应用到原始数据,合并完成后查询性能恢复正常
  • 整个过程无需阻塞读取,数据修改几乎是即时生效的。

    实测数据:1700倍加速意味着什么

    ClickHouse官方给出了在标准lineitem表上的基准测试结果:

    patch-on-read 查询执行机制(ClickHouse 官方架构图)

    更新方式 批量UPDATE速度 单行UPDATE速度 查询影响
    传统mutation 1x (基准) 1x (基准) 0%
    ReplacingMergeTree + FINAL N/A N/A 慢280%
    新架构Patch Part 快1700倍 快2400倍 临时慢12%

    关键数字解读:

  • 批量UPDATE快1700倍:原来需要1小时的批量更新,现在可能只需2秒。这意味着以前不敢想的”实时数据修正”变成了可能。
  • 单行UPDATE快2400倍:对于需要逐条修正的场景(如用户资料变更、交易状态更新),从原来不可用变成可以接受。
  • 查询影响:补丁合并完成前,查询会慢约12%。但合并完成后(通常秒级),性能完全恢复。相比之前使用ReplacingMergeTree + FINAL导致的永久性280%性能下降,这个代价完全值得。
  • 应用场景:OLAP也能玩转实时数据

    轻量级更新让ClickHouse从”纯分析”走向”分析+实时写入”双模式:

    实时数据修正:上游pipeline发现并修复错误数据后,无需重建整个分区,直接PATCH掉错误行

    GDPR合规删除:用户行使”被遗忘权”时,一行DELETE即可清除个人数据,无需重建索引

    缓慢变化维度(SCD):电商商品价格、库存状态等频繁变化的维度,可以直接UPDATE,无需重新加载整个表

    实时交易状态更新:订单状态、支付结果等需要即时更新的字段,现在可以在ClickHouse中直接完成

    实时数据 enrichment:将流式计算的结果(如用户行为画像)增量写入ClickHouse,同时进行查询分析

    语法变化:从方言到ANSI标准

    新架构支持标准SQL语法,不再需要学习ClickHouse特有的方言:

    -- 传统重量级mutation(仍可用,但不推荐)
    ALTER TABLE wikistat DELETE WHERE project = 'SlowQueries'
    
    -- 新语法:轻量级更新
    UPDATE wikistat SET hits = hits + 1 WHERE path = 'Google'
    SETTINGS allow_experimental_lightweight_update = 1, apply_patch_parts = 1
    
    -- 新语法:轻量级删除  
    DELETE FROM wikistat WHERE user_id = 12345
    SETTINGS allow_experimental_lightweight_delete = 1

    这对从MySQL/PostgreSQL迁转的团队非常友好,SQL语句几乎可以直接复用。

    与其他方案的对比

    ClickHouse官方对比了三条技术路径:

    方案 写入性能 读取性能 维护复杂度
    传统mutation 慢 正常 中
    ReplacingMergeTree + FINAL 正常 慢280% 低
    Patch Part (新架构) 快1700倍 临时慢12% 低

    在实时性要求越来越高的现代数据架构中,Patch Part可能是近几年OLAP领域最重要的技术创新之一。

    中国开发者需要注意的

  • 存量系统迁移:如果你的系统目前用PostgreSQL/MySQL做实时写入,用ClickHouse做分析,可能可以统一到ClickHouse。轻量级更新让一份数据同时支持交易和分析成为可能。
  • 写入吞吐量:虽然单行更新快了2400倍,但ClickHouse本质仍是OLAP,不建议用它替代OLTP数据库做高频交易类写入。它的强项是海量数据分析,实时更新是”可以做到”而非”最优选择”。
  • Cloud托管服务:ClickHouse Cloud已经自动处理后台合并和补丁应用,运维成本更低。如果不想自建,可以考虑云服务。

  • 小夏点评

  • 架构启示:ClickHouse用Patch Part解决了”列式存储+Immutable=不能更新”的固有矛盾。这提醒我们,看似不可改变的技术约束,往往可以通过重新设计数据模型来突破。中国的数据库从业者在选型时,不应被”OLAP只能读”的思维定式束缚。
  • 实时数据架构:轻量级更新让”流批一体”的实现更近一步。以前很多团队为了实时性要把数据同时写进MySQL(做更新)和ClickHouse(做分析),现在可以一份ClickHouse打天下。如果你的业务既有实时写入需求,又有海量分析需求,可以重新评估这个架构。
  • 对中国IT运维/开发者的启示:ClickHouse在国产化替代潮中已经是一个热门选择(华为云、阿里云都有托管ClickHouse)。轻量级更新让它的使用场景更广了。但要记住,它的核心优势仍是海量数据秒级分析,不要因为支持了UPDATE就把它当MySQL用——高频单条写入不是它的设计目标。

  • 原文参考

  • Lightweight Updates: ClickHouse Core Database Innovations for Real-Time Analytics – ClickHouse官方博客, 2025年
  • How to update data in ClickHouse (2025 edition) – ClickHouse
  • 您可能还喜欢...

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注