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,实现数据可视化和监控。
相关推荐
Edingbrugh.南空7 小时前
Flink ClickHouse 连接器维表源码深度解析
java·clickhouse·flink
unhurried人生——冕临2 天前
Ubuntu安装ClickHouse
clickhouse
爱吃萝卜的猪13 天前
Clickhouse源码分析-Replicated Database创建流程
clickhouse
编程的大耳朵13 天前
ClickHouse 概述
clickhouse
Ethan301414 天前
Clickhouse官方文档学习笔记
笔记·学习·clickhouse
weixin_3077791315 天前
Python实现MySQL建表语句转换成Clickhouse SQL
数据库·python·sql·mysql·clickhouse
大千AI助手24 天前
硬核实战 | 3分钟Docker部署ClickHouse列存数据库
大数据·clickhouse·docker·database
Sayai25 天前
dbeaver 查询clickhouse,数据库时间差了8小时
数据库·clickhouse·oracle
weixin_307779131 个月前
Clickhouse统计指定表中各字段的空值、空字符串或零值比例
运维·数据仓库·clickhouse
weixin_307779131 个月前
Linux下GCC和C++实现统计Clickhouse数据仓库指定表中各字段的空值、空字符串或零值比例
linux·运维·c++·数据仓库·clickhouse