第 7 章 · 写入与读取最佳实践

交互式演示:批量大小 vs 写入耗时 / async_insert 工作流 / FORMAT 性能矩阵

批量大小如何影响写入耗时与 Part 数

拖动滑块改变 batch_size(每次 INSERT 的行数)和总写入行数,观察「耗时」与「磁盘 Part 数」的变化。模型基于 ClickHouse 真实经验值:每次 INSERT 流水线常数约 3 ms,每行处理约 3 µs,单 Part 容量软上限 ~ 100 万行。

10000
1,000,000
写入耗时
越小越好
写入吞吐
行/秒
生成 Part 数
≤ 300 才安全
服务端状态
阈值告警
提示:经验法则是 batch_size ≥ 100,000,每秒不超过 1~2 次 INSERT。

async_insert 工作流动画:客户端 → buffer → flush

点击「客户端发送 INSERT」按钮,每次发送 1 条数据,看它如何进入 query buffer,并在达到阈值后整批 flush 成一个 Part。

阈值:10 MB200 ms

① 客户端 (clickhouse-connect)

已发送行数:0

② 服务端 query buffer

buffer:0 bytes / 10485760 bytes | 距上次 flush 0 ms
达到 async_insert_max_data_sizeasync_insert_busy_timeout_ms 就 flush

③ 磁盘 Parts

已落盘 Part:0
关键点:客户端只要 wait_for_async_insert=0 就会立刻拿到 ack, 实际数据还在 buffer 里。当服务端 crash 时这部分会丢失,所以重要业务请用 wait_for_async_insert=1

对比:三种写入模式

模式客户端阻塞?1 条数据何时落盘crash 是否丢典型延迟
同步逐条 INSERT立即10~50 ms / 条
批量 INSERT批结束时批结束 (秒级)
async_insert (wait=1)flush 时200 ms ~ 几秒
async_insert (wait=0)flush 时~1 ms (ack)
Buffer 引擎触发条件时1 ms (内存写)

FORMAT 性能矩阵:选哪个最适合你?

同样 1000 万行(5 列:DateTime+UInt64+String+Float64+String)的写入耗时与文件大小对比。点击卡片查看典型用法。

推荐用法(背下来这张表)

场景FORMAT 首选备选
ClickHouse → ClickHouse 互导NativeRowBinary
落数据湖 / 给 Spark 用ParquetORC
Kafka 生态对接AvroJSONEachRow
调试 / 跨语言JSONEachRowCSVWithNames
简单 ETL 文本TabSeparatedWithNamesCSVWithNames
千万行以下临时手敲Values—(仅人工调试)