ClickHouse 是一款开源的列式数据库管理系统(DBMS),由 Yandex 开发,专为联机分析处理(OLAP )设计,具备高性能、低延迟、海量数据处理能力,广泛应用于日志分析、用户行为分析、指标监控、广告系统等场景。
一、ClickHouse 的核心特性
特性 | 描述 |
---|---|
列式存储 | 每列独立存储,适合只读部分字段的分析场景 |
超高压缩比 | 通过 LZ4/ZSTD 压缩列数据,节省存储 |
向量化执行 | 使用 SIMD 技术批量处理数据,极大提升执行效率 |
支持 SQL | 类似 MySQL 的语法,易于上手 |
分布式架构 | 支持分布式部署、并行计算 |
实时写入 + 秒级查询 | 支持插入后立即可查 |
高并发读写 | 支持上千个并发查询/写入 |
MPP 架构 | 多节点分布式计算,处理 PB 级数据 |
二、ClickHouse 的基本架构
+---------------------+
| Query Interface | ← SQL 查询
+---------------------+
↓
+-----------------------------+
| ClickHouse Server |
| - 查询解析/优化 |
| - 向量化执行器 |
+-----------------------------+
↓ ↓ ↓
+---------+ +----------+ +----------+
| MergeTree | Aggregator | Buffering |
+---------+ +----------+ +----------+
↓
存储层:列式存储、压缩、分区
三、核心存储引擎:MergeTree
系列
ClickHouse 中最常用的是 MergeTree
存储引擎族,常见子类有:
引擎名 | 特点 |
---|---|
MergeTree | 支持排序键、分区、自动合并 |
SummingMergeTree | 自动聚合相同主键的值 |
AggregatingMergeTree | 聚合函数结果存储 |
ReplacingMergeTree | 支持替换记录(常用于更新) |
VersionedCollapsingMergeTree | 支持版本合并,用于软删除等 |
四、建表语法示例
sql
CREATE TABLE user_behavior (
uid UInt64,
region String,
event String,
ts DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(ts)
ORDER BY (uid, ts);
PARTITION BY
: 数据分区加快查询
ORDER BY
: 提高过滤/聚合性能
ENGINE = MergeTree
: 核心存储引擎,支持高并发读写
五、ClickHouse 查询示例
1. 分组聚合
sql
SELECT region, COUNT(*)
FROM user_behavior
WHERE ts >= now() - INTERVAL 1 DAY
GROUP BY region;
2. TopN 分析
sql
SELECT event, COUNT(*) AS cnt
FROM user_behavior
GROUP BY event
ORDER BY cnt DESC
LIMIT 10;
六、性能优化建议
优化点 | 推荐 |
---|---|
分区设计 | 建议按时间字段进行分区(如按月) |
ORDER BY | 选择高选择度字段,如用户ID |
查询时限范围 | WHERE 中加时间限制,命中分区 |
使用物化视图 | 提前聚合,秒级返回 |
避免联表查询 | 推荐宽表设计,或先JOIN生成宽表 |
七、集群部署简要
ClickHouse 支持 分布式集群,核心组件包括:
+---------------+ +---------------+
| Shard 1 | ... | Shard N |
| + Replica A | | + Replica A |
| + Replica B | | + Replica B |
+---------------+ +---------------+
↓ ↓
Distributed Engine + ZooKeeper 实现分布式查询
支持 自动副本同步、主备复制、数据容灾
八、适用场景
应用场景 | 描述 |
---|---|
用户行为分析 | 电商、APP 行为采集与分析 |
日志分析 | Nginx、Kafka、应用日志存储与查询 |
广告系统 | 曝光、点击、转化率分析 |
IoT 数据处理 | 设备指标收集与统计 |
实时 BI 报表 | 秒级响应的统计面板数据支持 |
九、ClickHouse 与其他 OLAP 引擎对比
特性 | ClickHouse | Apache Doris | StarRocks |
---|---|---|---|
存储模型 | 列式 | 列式 + 行式 | 列式 |
查询性能 | 非常高 | 高 | 极高 |
实时能力 | 秒级延迟 | 秒级延迟 | 毫秒级 |
更新能力 | 弱(需合并) | 强(自动更新) | 强 |
SQL 支持 | 基础 SQL | MySQL 兼容 | MySQL 兼容 |
并发性能 | 非常高 | 高 | 高 |
十、SpringBoot 集成 ClickHouse 简要代码
xml
<!-- Maven 依赖 -->
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2-patch13</version>
</dependency>
java
// Spring JDBC 配置
@Configuration
public class ClickHouseConfig {
@Bean
public DataSource dataSource() {
ClickHouseDataSource dataSource = new ClickHouseDataSource("jdbc:clickhouse://localhost:8123/default");
return dataSource;
}
}
十一、可视化工具推荐
- ClickHouse Keeper:集群监控
- Grafana + Prometheus:实时图表监控
- CKBox / Tabix UI:Web 查询分析界面
5. ClickHouse 常见操作
a. 表的创建
ClickHouse 的表结构可以是非常简单的,也可以包含高级的分区和索引设置。创建表时,可以使用不同的引擎(如 MergeTree、ReplacingMergeTree 等)。
CREATE TABLE example_table
(
id UInt32,
name String,
score Float32,
timestamp DateTime
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (id, timestamp);
b. 数据插入
ClickHouse 支持批量数据插入,插入速度极快,适合处理大规模数据写入场景。
INSERT INTO example_table (id, name, score, timestamp)
VALUES (1, 'Alice', 98.5, now()), (2, 'Bob', 88.0, now());
c. 查询
ClickHouse 的查询语法类似于 SQL,支持常见的 SQL 操作,同时增加了不少扩展功能,尤其是聚合查询方面性能极佳。
SELECT name, AVG(score)
FROM example_table
WHERE score > 80
GROUP BY name;
d. 分布式查询
如果部署了分布式集群,可以使用 Distributed 引擎来执行跨节点的查询。
CREATE TABLE distributed_table AS example_table
ENGINE = Distributed(cluster_name, database_name, table_name, rand());
- ClickHouse 异常处理
ClickHouse 的错误处理机制较为简单直接,如果发生写入错误或查询失败,通常会抛出具体的异常。对于生产环境,可以通过日志系统或监控工具来捕获这些异常。 - 与其他工具的集成
ClickHouse 可以与 Kafka、Zookeeper、Grafana 等常见的工具进行集成:
Kafka:ClickHouse 支持从 Kafka 实时消费数据。
Zookeeper:用于管理 ClickHouse 集群中的分布式元数据。
Grafana:可以将 ClickHouse 数据源接入 Grafana,实现数据可视化和监控。