ClickHouse
问题
什么是 ClickHouse?为什么它查询这么快?
答案
ClickHouse 核心特点
ClickHouse 是由 Yandex 开源的列式存储分析数据库,以极致的查询性能著称。
| 特点 | 说明 |
|---|---|
| 列式存储 | 只读取查询需要的列,减少 IO |
| 向量化执行 | 批量处理 + SIMD 指令 |
| 数据压缩 | 列式天然高压缩率(5~10x) |
| MergeTree | 核心存储引擎,异步合并 |
为什么快
常用表引擎
| 引擎 | 适用场景 |
|---|---|
| MergeTree | 通用,最常用 |
| ReplacingMergeTree | 数据去重(最终一致) |
| AggregatingMergeTree | 预聚合 |
| SummingMergeTree | 自动求和 |
-- 创建 MergeTree 表
CREATE TABLE events (
event_date Date,
user_id UInt64,
event_name String,
amount Decimal(18, 2)
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_date) -- 按月分区
ORDER BY (event_date, user_id); -- 排序键
-- 典型分析查询(亚秒级)
SELECT
toDate(event_date) AS dt,
COUNT() AS events,
uniq(user_id) AS uv, -- 近似去重(HyperLogLog)
SUM(amount) AS total_amount
FROM events
WHERE event_date >= '2024-01-01'
GROUP BY dt
ORDER BY dt;
ClickHouse 的局限
- 不擅长高并发点查(适合分析,不适合 OLTP)
- 更新/删除代价大(MergeTree 异步合并)
- JOIN 性能一般(建议预先宽表化)
- 运维复杂(集群管理、数据一致性)
常见面试问题
Q1: ClickHouse 适合什么场景?
答案:
- BI 看板、实时报表
- 日志分析、行为分析
- 大宽表聚合查询
- 不适合高并发小查询、频繁更新
Q2: ClickHouse 数据如何导入?
答案:
- 批量导入:
INSERT INTO ... SELECT ...、CSV 文件 - 实时导入:Kafka 引擎直接消费
- CDC 同步:通过 Flink/Spark 写入
相关链接
- 列式存储原理 - 列式存储详解
- Doris/StarRocks - 对比方案