三个交互演示:① 行存 vs 列存的 IO 差异 · ② 向量化批处理流水线 · ③ OLAP 数据库定位象限
调一下「行数 / 列数 / 查询使用的列」,看左右两边「磁盘上真正读的数据量」差多少倍。一句话理解:OLAP 查询大多只用 5~10 列,但行存逼你把所有列都搬到内存里再丢。
SELECT SUM(amount) ~ 8.3 秒;ClickHouse 同 SQL ~ 56 毫秒;约 150 倍差距。
ClickHouse 内部所有数据以 Block(默认 65535 行 × N 列的列式批量)为单位流动。点「▶ 启动流水线」看 8 个 Block 依次走完 4 个算子;右侧「逐行模式」对比 —— 同样 4096 行,逐行模式要走 4096 次循环,向量化只走 4 次。
横轴是「查询并发 / 实时性」(越往右越实时、越能扛高 QPS),纵轴是「写入吞吐 / 单机性能」(越往上越能扛大数据量)。点圆点看每个数据库的定位与差异化能力。
每个 OLAP 系统都有自己的强项 —— ClickHouse 主打「单机暴力 + 简单粗暴 + 极致压缩」;Doris 主打「JOIN 强 + MPP 优化器」;Druid 主打「实时摄入 + 预聚合」;Snowflake 主打「云原生 + Serverless 弹性」。选型时先想清场景,再选合适的工具。
| 能力 | MySQL/PG | ClickHouse | Doris/StarRocks | Druid |
|---|---|---|---|---|
| 存储模型 | 行存 | 列存 | 列存 | 列存 + 倒排 |
| 单机扫描性能 | ★★ | ★★★★★ | ★★★★ | ★★★ |
| JOIN 能力 | ★★★★★ | ★★ (弱,靠字典) | ★★★★ | ✗ 不支持 |
| 事务 | ★★★★★ | 仅单分区原子 | 弱 | 无 |
| 实时摄入 | — | ★★★★ (Kafka 引擎) | ★★★★ | ★★★★★ |
| UPDATE/DELETE | 实时 | Mutation 异步 | Mutation 异步 | 不支持 |
| 压缩比 | 低 | 极高 (5~20×) | 高 | 高 |
| SQL 标准遵循 | ★★★★ | ★★★ (方言) | ★★★★ | ★★ (DSL) |
| 运维复杂度 | 低 | 低 (单机猛) | 中 | 高 |