ClickHouse详解

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());
  1. ClickHouse 异常处理
    ClickHouse 的错误处理机制较为简单直接,如果发生写入错误或查询失败,通常会抛出具体的异常。对于生产环境,可以通过日志系统或监控工具来捕获这些异常。
  2. 与其他工具的集成
    ClickHouse 可以与 Kafka、Zookeeper、Grafana 等常见的工具进行集成:
    Kafka:ClickHouse 支持从 Kafka 实时消费数据。
    Zookeeper:用于管理 ClickHouse 集群中的分布式元数据。
    Grafana:可以将 ClickHouse 数据源接入 Grafana,实现数据可视化和监控。
相关推荐
知其_所以然1 天前
使用docker安装clickhouse集群
clickhouse·docker·容器
wuli玉shell2 天前
Doris和Clickhouse对比
clickhouse·doris
SelectDB技术团队5 天前
可观测性方案怎么选?SelectDB vs Elasticsearch vs ClickHouse
大数据·数据仓库·clickhouse·elasticsearch·信息可视化·doris·半结构化
goTsHgo5 天前
ClickHouse多表join的性能优化:原理与源码详解
clickhouse·性能优化
妖果yaoyao7 天前
docker 部署clickhouse
clickhouse·docker·容器
鱼鱼不愚与8 天前
处理 Clickhouse 内存溢出
数据库·分布式·clickhouse
Wonderful_一直有你8 天前
clickhouse - 重新建表覆盖旧表-解决分区时间错误问题-197001
clickhouse
千月落10 天前
ClickHouse副本集群
服务器·数据库·clickhouse
Steven-Russell10 天前
Clickhouse基于breakpad生成minidump文件,方便问题定位
clickhouse·breakpad