当前位置: 首页 > news >正文

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支持版本合并,用于软删除等

四、建表语法示例

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. 分组聚合

SELECT region, COUNT(*) 
FROM user_behavior 
WHERE ts >= now() - INTERVAL 1 DAY 
GROUP BY region;

2. TopN 分析

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 引擎对比

特性ClickHouseApache DorisStarRocks
存储模型列式列式 + 行式列式
查询性能非常高极高
实时能力秒级延迟秒级延迟毫秒级
更新能力弱(需合并)强(自动更新)
SQL 支持基础 SQLMySQL 兼容MySQL 兼容
并发性能非常高

十、SpringBoot 集成 ClickHouse 简要代码

<!-- Maven 依赖 -->
<dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.3.2-patch13</version>
</dependency>
// Spring JDBC 配置
@Configuration
public class ClickHouseConfig {@Beanpublic 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,实现数据可视化和监控。

相关文章:

  • ElasticSearch重启之后shard未分配问题的解决
  • Rocky Linux 9.5 基于kubeadm部署k8s
  • 微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)
  • 安全扫描之 Linux 杀毒软件 Clamav 安装
  • 查询电脑伪装IP,网络安全速查攻略!
  • 代码随想录 算法训练 Day1:数组
  • 深度解析网闸策略:构建坚固的网络安全防线
  • R利用spaa包计算植物/微生物的生态位宽度和重叠指数
  • rhce 9 考题与解析笔记
  • 【网络实验】-BGP-EBGP的基本配置
  • 【Java学习笔记】equals方法
  • 什么是 Shadow Testing?
  • 聊聊JetCache的缓存构建
  • 【Python】超类与父类
  • 关于数据湖和数据仓的一些概念
  • 抢跑「中央计算+区域控制」市场,芯驰科技高端智控MCU“芯”升级
  • AcroForm JavaScript Promise 对象应用示例: 异步加载PDF文件
  • JS,ES,TS三者什么区别
  • python如何设置excel单元格边框样式
  • 云图库和黑马点评的项目学习经验
  • 玉渊谭天丨卢拉谈美国降低对华关税:中国的行动捍卫了主权
  • 人民日报:从“轻微免罚”看涉企执法方式转变
  • 山东市监局回应“盒马一批次‘无抗’鸡蛋抽检不合格后复检合格”:系生产商自行送检
  • “远践”项目启动公益生态圈,上海青少年公益力量蓬勃生长
  • 来伊份发布关于消费者反映蜜枣粽问题处理的情况说明:与消费者达成和解
  • 食用城市|食饭识人