拖动滑块改变 batch_size(每次 INSERT 的行数)和总写入行数,观察「耗时」与「磁盘 Part 数」的变化。模型基于 ClickHouse 真实经验值:每次 INSERT 流水线常数约 3 ms,每行处理约 3 µs,单 Part 容量软上限 ~ 100 万行。
点击「客户端发送 INSERT」按钮,每次发送 1 条数据,看它如何进入 query buffer,并在达到阈值后整批 flush 成一个 Part。
10 MB 或 200 ms
async_insert_max_data_size 或
async_insert_busy_timeout_ms 就 flush
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 (内存写) |
同样 1000 万行(5 列:DateTime+UInt64+String+Float64+String)的写入耗时与文件大小对比。点击卡片查看典型用法。
| 场景 | FORMAT 首选 | 备选 |
|---|---|---|
| ClickHouse → ClickHouse 互导 | Native | RowBinary |
| 落数据湖 / 给 Spark 用 | Parquet | ORC |
| Kafka 生态对接 | Avro | JSONEachRow |
| 调试 / 跨语言 | JSONEachRow | CSVWithNames |
| 简单 ETL 文本 | TabSeparatedWithNames | CSVWithNames |
| 千万行以下临时手敲 | Values | —(仅人工调试) |