惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
GRAHAM CLULEY
T
Tenable Blog
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Privacy International News Feed
S
Security Affairs
NISL@THU
NISL@THU
O
OpenAI News
Attack and Defense Labs
Attack and Defense Labs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Schneier on Security
Schneier on Security
S
SegmentFault 最新的问题
S
Schneier on Security
G
Google Developers Blog
V
V2EX
C
Check Point Blog
U
Unit 42
Google DeepMind News
Google DeepMind News
T
Threatpost
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
M
MIT News - Artificial intelligence
S
Secure Thoughts
博客园 - 司徒正美
Recorded Future
Recorded Future
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
K
Kaspersky official blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
AI
AI
博客园 - 聂微东
N
News and Events Feed by Topic
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
Recent Commits to openclaw:main
Recent Commits to openclaw:main
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
Project Zero
Project Zero
W
WeLiveSecurity
博客园 - Franky

博客园 - Lemo_wd

flutter —— iOS 的构建与分发 flutter —— 理解 iOS 的依赖管理 wireguard 入门 k3s 基础 —— 将 traefik 替换为 ingress-nginx Pr 入门 为什么 TCP 是3次握手4次挥手? 给 ssh 私钥文件配置统一口令 滚动部署零碎笔记1 Clickhouse 物化视图与投影 Clickhouse 主键索引 Clickhouse 核心概念 ClickHouse 案例学习 —— 使用 ClickHouse 探索 GitHub 统计信息 linux Tun/Tap 虚拟网卡 Clickhouse 的 kafka Engine 集成 局域网中的设备间的流量转发 d3.js 构建股权架构图并绘制双向节点树 final cut pro 入门 d3.js 构建股权架构图并绘制股权百分比 flutter 的滚动控制 —— 滚动类组件的内部与整体滚动
Clickhouse 表引擎 —— MergeTree
Lemo_wd · 2025-04-09 · via 博客园 - Lemo_wd

参考文档 ReplacingMergetree

-- MergeTree 原理:
-- 底层使用类似LSM树的方式提供数据的快速读写功能。即新的数据(包括更新以及删除的数据)并不会影响原有的数据,
-- 而是会记录在一个新开辟的临时数据块中。查询时通过版本号查询最新的一条结果。
-- 新开辟的数据需要等到后台进行数据合并时,才会进入到主数据中(减少数据碎片化)。

CREATE TABLE t_stock
(
    id           UInt32,
    sku_id       String,
    total_amount Decimal(16, 2),
    create_time  Datetime
)
    ENGINE = MergeTree
        PARTITION BY toYYYYMMDD(create_time)
        PRIMARY KEY id
        ORDER BY (id, sku_id);

INSERT INTO t_stock VALUES
                        (101,'sku_002',2000.00,'2020-06-01 11:00:00'),
                        (102,'sku_004',2500.00,'2020-06-01 12:00:00'),
                        (103,'sku_002',2000.00,'2020-06-02 13:00:00'),
                        (104,'sku_002',12000.00,'2020-06-03 13:00:00'),
                        (105,'sku_002',600.00,'2020-06-04 12:00:00');


-- ReplacingMergeTree 去重逻辑:
-- 根据 order by 作为判断重复的标准。
-- 只在分区内去重。
-- 保留版本字段最大的一条数据。如果没有指定版本,或者版本值重复,则保留最后插入的一条数据。
-- 同一批插入数据时会对数据进行去重。多批次插入可能有重复,需要等待后台数据合并。

CREATE TABLE t_stock_merge
(
    id           UInt32,
    sku_id       String,
    total_amount Decimal(16, 2),
    create_time  Datetime
)
    ENGINE = ReplacingMergeTree(create_time) -- create_time 是版本字段
        PARTITION BY toYYYYMMDD(create_time)
        PRIMARY KEY id
        ORDER BY (id, sku_id);

INSERT INTO t_stock_merge
VALUES (101, 'sku_001', 1000.00, '2020-06-01 12:00:00'),
       (102, 'sku_002', 2000.00, '2020-06-01 11:00:00'),
       (102, 'sku_004', 2500.00, '2020-06-01 12:00:00'),
       (102, 'sku_002', 2000.00, '2020-06-01 13:00:00'),
       (102, 'sku_002', 12000.00, '2020-06-01 13:00:00'),
       (102, 'sku_002', 600.00, '2020-06-02 12:00:00');


其它

CoalescingMergeTree

支持按列级别“持久化最新非 NULL 值”,实现列级的更新,非常适用于部分字段变更的场景。

适用场景

  1. 仅部分字段更新,其他字段保持不变,但你又不想每次写入都带上完整行。
  2. 想要实现轻量级、增量式的列级 upsert。

CollapsingMergeTree

通过 Sign 签名列支持“软删除”与状态更新,保留历史版本,适合需要历史追踪场景

适用场景

  1. 追踪对象状态变化历史,同时希望只保留当前有效状态。
  2. 有删除/更新需求,但不想执行昂贵的 UPDATE 操作