|
1 | 1 | # ClickHouse |
2 | 2 |
|
3 | | -## 介绍 |
4 | | - |
5 | | -- [ClickHouse](https://github.com/ClickHouse/ClickHouse) |
6 | | -- [使用场景](https://zhuanlan.zhihu.com/p/98439924) |
7 | | - |
8 | | -# **ClickHouse 原理详细介绍** |
9 | | - |
10 | | -ClickHouse 是一个开源的 **列式存储** 数据库管理系统,专为 **实时分析** 设计,具有 **高性能 OLAP(Online Analytical Processing)查询** 能力。它主要用于处理大规模数据的实时分析,如日志数据、金融交易、区块链数据等。 |
11 | | - |
12 | | ---- |
13 | | - |
14 | | -## **1️⃣ ClickHouse 体系架构** |
15 | | -ClickHouse 采用 **Shared-Nothing 分布式架构**,每个节点都可以独立运行,并通过分片(Sharding)和副本(Replication)提升可用性和性能。 |
16 | | - |
17 | | -### **🔹 主要组件** |
18 | | -- **MergeTree 存储引擎**:核心存储引擎,支持数据的列式存储和分区管理,适用于大规模数据处理。 |
19 | | -- **SQL 查询优化器**:支持 `ORDER BY`、`GROUP BY`、`bloom_filter` 等优化策略,提升查询效率。 |
20 | | -- **分布式计算**:通过 `Distributed` 表实现数据的水平扩展。 |
21 | | -- **高效索引机制**:包括 **主键索引(Primary Index)、稀疏索引(Sparse Index)、跳跃索引(Skip Index)**,减少 I/O 读取量。 |
22 | | -- **数据压缩**:ClickHouse 使用多种压缩算法(如 LZ4、ZSTD)减少存储占用,提高查询性能。 |
23 | | - |
24 | | ---- |
25 | | - |
26 | | -## **2️⃣ ClickHouse 的存储原理** |
27 | | -ClickHouse 采用 **列式存储(Columnar Storage)**,与传统 **行存储(Row-Based Storage)** 不同: |
28 | | -- **列存储**:仅存储查询所需的列,减少 I/O 读取,加速聚合查询。 |
29 | | -- **高效压缩**:相同类型的数据存储在一起,压缩率更高。 |
30 | | -- **批量处理**:优化 `GROUP BY`、`ORDER BY` 操作,提升计算效率。 |
31 | | - |
32 | | -### **🔹 MergeTree 存储引擎** |
33 | | -`MergeTree` 是 ClickHouse 最常用的存储引擎,提供 **分区(Partitioning)、索引(Primary Index)、数据合并(Merge)** 等功能。 |
34 | | - |
35 | | -#### **🌟 MergeTree 关键特性** |
36 | | -| **特性** | **描述** | |
37 | | -|----------------------|--------| |
38 | | -| **分区(Partitioning)** | 通过 `PARTITION BY` 定义数据存储分区,提升查询效率 | |
39 | | -| **主键索引(Primary Index)** | 采用稀疏索引,仅存储部分数据,提高查询速度 | |
40 | | -| **数据合并(Merge)** | 后台自动合并数据文件,提升存储效率 | |
41 | | -| **TTL 过期删除(TTL Expiry)** | 自动清理历史数据,减少存储成本 | |
42 | | - |
43 | | ---- |
44 | | - |
45 | | -## **3️⃣ ClickHouse 的查询优化** |
46 | | -ClickHouse 针对大规模数据查询进行了深度优化: |
47 | | - |
48 | | -### **🔹 索引机制** |
49 | | -- **主键索引(Primary Index)**:基于 `ORDER BY` 维护的索引,加速范围查询。 |
50 | | -- **跳跃索引(Skip Index)**:跳过不必要的数据块,减少 I/O。 |
51 | | -- **bloom_filter**:加速 `WHERE` 过滤条件匹配。 |
52 | | - |
53 | | -### **🔹 查询优化策略** |
54 | | -| **优化点** | **描述** | |
55 | | -|------------------|--------| |
56 | | -| **向量化执行** | 采用 SIMD 指令加速计算 | |
57 | | -| **预计算(Materialized View)** | 通过物化视图存储聚合结果,提高查询性能 | |
58 | | -| **分布式查询(Distributed Query)** | 通过分片加速大规模数据查询 | |
59 | | -| **并行查询(Parallel Query)** | 多核并行处理 SQL,提高执行速度 | |
60 | | - |
61 | | ---- |
62 | | - |
63 | | - |
64 | | -### **🔹 ClickHouse vs 其他数据库** |
65 | | -| **对比项** | **ClickHouse** | **MySQL** | **StarRocks** | |
66 | | -|---------------|-------------|----------|-------------| |
67 | | -| **存储模型** | 列式存储 | 行式存储 | 列式存储 | |
68 | | -| **查询性能** | 高并发、OLAP | 适用于 OLTP | 高并发、实时分析 | |
69 | | -| **索引机制** | 主键索引、跳跃索引 | B+ 树索引 | 主键索引、物化视图 | |
70 | | -| **实时性** | 主要用于批处理 | 事务处理 | 近实时分析 | |
71 | | -| **适用场景** | 日志分析、BI、金融数据 | 事务处理 | 实时数据分析 | |
72 | | - |
73 | | ---- |
74 | | - |
75 | | -## **5️⃣ ClickHouse 的优缺点** |
76 | | -### **✅ 优势** |
77 | | -- **超高查询性能**:列式存储 + 并行计算,查询速度远超传统数据库。 |
78 | | -- **高效数据压缩**:降低存储成本,提高查询效率。 |
79 | | -- **分布式架构**:支持海量数据存储 & 分布式计算。 |
80 | | -- **灵活的 SQL 支持**:兼容大部分 SQL 语法,易于迁移。 |
81 | | - |
82 | | -### **❌ 限制** |
83 | | -- **不支持事务(ACID)**:适用于 OLAP 场景,不适用于高并发事务处理。 |
84 | | -- **数据更新较慢**:追加写入模式,不适用于频繁更新数据的场景。 |
85 | | -- **高内存占用**:需要大量内存优化查询。 |
86 | | - |
87 | | ---- |
88 | | - |
89 | | -## **6️⃣ 总结** |
90 | | -ClickHouse 是 **高性能 OLAP 数据库**,专为 **大规模数据分析** 设计,采用 **列式存储、MergeTree 引擎、分布式计算** 提供超快的查询速度。适用于 **日志分析、金融交易、区块链数据** 等实时分析场景,但不适用于高并发 OLTP 事务处理。 |
91 | | - |
92 | | - |
93 | | -# **Shared-Nothing 分布式架构** |
94 | | - |
95 | | -## **🔹 Shared-Nothing 架构概述** |
96 | | -**Shared-Nothing(无共享)架构** 是一种分布式系统设计理念,其中 **每个节点都是独立的,不共享 CPU、内存、磁盘或网络资源**。每个节点自主存储和处理数据,并通过网络通信协作完成分布式计算。 |
97 | | - |
98 | | ---- |
99 | | - |
100 | | -## **🔹 Shared-Nothing vs. 其他架构** |
101 | | -| **架构类型** | **描述** | **代表数据库** | |
102 | | -|---------------------|--------|--------------| |
103 | | -| **Shared-Nothing** | **每个节点独立**,无资源共享,横向扩展能力强 | ClickHouse、StarRocks、Hadoop、CitusDB | |
104 | | -| **Shared-Disk** | 多个节点共享磁盘存储,计算独立 | Oracle RAC、IBM DB2 | |
105 | | -| **Shared-Memory** | 多个计算节点共享内存和磁盘 | SAP HANA | |
| 3 | +## 一、概述 |
| 4 | +### 1.1 定义 |
| 5 | +ClickHouse 是开源的**列式存储数据库**,专为实时分析设计,具有高性能OLAP查询能力,适用于日志分析、金融交易等场景。 |
| 6 | + |
| 7 | +### 1.2 核心特性 |
| 8 | +- **列式存储**:仅读取查询列,减少I/O |
| 9 | +- **高压缩率**:LZ4/ZSTD压缩算法 |
| 10 | +- **分布式架构**:Shared-Nothing架构支持水平扩展 |
| 11 | +- **SQL兼容**:支持标准SQL语法 |
| 12 | +- **实时分析**:支持每秒万级QPS的聚合查询 |
| 13 | + |
| 14 | +### 1.3 适用场景 |
| 15 | +- 日志/事件数据分析 |
| 16 | +- 实时BI报表 |
| 17 | +- 时序数据存储 |
| 18 | +- 用户行为分析 |
| 19 | +- 区块链交易追踪 |
106 | 20 |
|
107 | 21 | --- |
108 | 22 |
|
109 | | -## **🔹 Shared-Nothing 架构的关键特性** |
110 | | -1. **分布式存储** |
111 | | - - 每个节点存储独立数据,避免磁盘 I/O 竞争,提高吞吐量。 |
112 | | -2. **分片(Sharding)** |
113 | | - - 数据按照一定策略(如哈希、范围)分配到不同节点,提高查询并发能力。 |
114 | | -3. **无集中式瓶颈** |
115 | | - - **没有共享存储或共享内存**,扩展时仅需增加新节点,支持 **水平扩展(Scale-Out)**。 |
116 | | -4. **高可用性 & 容错性** |
117 | | - - 通过数据副本(Replication)和故障恢复(Failover)机制,保证高可用性。 |
| 23 | +## 二、核心原理 |
| 24 | +### 2.1 体系架构 |
| 25 | +#### Shared-Nothing 架构 |
| 26 | +| 特性 | 说明 | |
| 27 | +|---------------|-------------------------------| |
| 28 | +| 节点独立性 | 每个节点独立存储/计算资源 | |
| 29 | +| 扩展方式 | 分片(Sharding)+副本(Replication) | |
| 30 | +| 数据分布 | Distributed表引擎管理分布式查询 | |
| 31 | +| 容错机制 | 多副本自动切换 | |
| 32 | + |
| 33 | +#### 架构对比 |
| 34 | +| 类型 | 特点 | 代表系统 | |
| 35 | +|---------------|-------------------------------|----------------| |
| 36 | +| Shared-Nothing | 无资源共享,横向扩展能力强 | ClickHouse | |
| 37 | +| Shared-Disk | 共享存储,计算节点独立 | Oracle RAC | |
| 38 | +| Shared-Memory | 共享内存和存储 | SAP HANA | |
| 39 | + |
| 40 | +### 2.2 存储引擎 |
| 41 | +#### MergeTree 系列 |
| 42 | +| 引擎类型 | 功能特性 | |
| 43 | +|--------------------------|---------------------------------------------| |
| 44 | +| MergeTree | 基础引擎,支持分区/索引/数据合并 | |
| 45 | +| ReplacingMergeTree | 删除重复数据(需指定版本列) | |
| 46 | +| CollapsingMergeTree | 通过Sign列折叠数据(±1标记) | |
| 47 | +| VersionedCollapsingMergeTree | 增加Version列解决乱序问题 | |
| 48 | +| SummingMergeTree | 自动聚合数值列 | |
| 49 | +| AggregatingMergeTree | 支持预聚合函数(uniq/state等) | |
| 50 | + |
| 51 | +#### 特殊引擎 |
| 52 | +| 引擎类型 | 适用场景 | |
| 53 | +|---------------|----------------------------------| |
| 54 | +| Log引擎 | 小数据量快速写入(无索引/事务) | |
| 55 | +| Integration引擎 | 外部数据源集成(如MySQL/Kafka) | |
| 56 | + |
| 57 | +### 2.3 查询优化 |
| 58 | +#### 索引机制 |
| 59 | +- **主键索引**:稀疏索引加速范围查询 |
| 60 | +- **跳跃索引**:跳过无关数据块(minmax/bloom_filter等) |
| 61 | +- **分区裁剪**:根据分区键过滤数据 |
| 62 | + |
| 63 | +#### 执行优化 |
| 64 | +| 优化技术 | 实现方式 | |
| 65 | +|---------------|----------------------------------| |
| 66 | +| 向量化执行 | SIMD指令加速批量计算 | |
| 67 | +| 并行计算 | 多核并行处理查询 | |
| 68 | +| 分布式查询 | 分片并行执行+结果聚合 | |
| 69 | +| 缓存机制 | 查询结果缓存(实验性) | |
118 | 70 |
|
119 | 71 | --- |
120 | 72 |
|
121 | | -## **🔹 Shared-Nothing 架构的优势** |
122 | | -| **优势** | **描述** | |
123 | | -|------------------|--------| |
124 | | -| **高可扩展性** | 通过增加节点即可扩展存储 & 计算能力 | |
125 | | -| **无共享瓶颈** | 每个节点独立工作,避免 I/O 或 CPU 竞争 | |
126 | | -| **高容错能力** | 节点故障不会影响整个系统,副本机制可恢复数据 | |
127 | | -| **并行计算** | 查询可在多个节点并发执行,提高吞吐量 | |
| 73 | +## 三、对比分析 |
| 74 | +### 3.1 与OLTP数据库对比 |
| 75 | +| 特性 | ClickHouse | MySQL | |
| 76 | +|---------------|---------------------|--------------------| |
| 77 | +| 存储模型 | 列式存储 | 行式存储 | |
| 78 | +| 事务支持 | 无 | ACID事务 | |
| 79 | +| 查询场景 | 大批量聚合查询 | 点查/简单查询 | |
| 80 | +| 更新性能 | 低(批量写入) | 高(行级更新) | |
| 81 | +| 数据压缩率 | 5-10倍 | 1-3倍 | |
| 82 | + |
| 83 | +### 3.2 与同类OLAP对比 |
| 84 | +| 特性 | ClickHouse | StarRocks | |
| 85 | +|---------------|---------------------|--------------------| |
| 86 | +| 实时写入 | 弱(批量导入) | 强(支持UPSERT) | |
| 87 | +| JOIN性能 | 需优化(分布式JOIN)| 本地JOIN优化 | |
| 88 | +| 资源隔离 | 无 | 支持资源组 | |
| 89 | +| 生态集成 | 丰富(Kafka/Spark) | 云原生集成 | |
128 | 90 |
|
129 | 91 | --- |
130 | 92 |
|
131 | | -## **🔹 Shared-Nothing 在 ClickHouse / StarRocks 中的应用** |
132 | | -### **🚀 ClickHouse** |
133 | | -- 采用 **分片(Sharding)+ 副本(Replication)** 机制。 |
134 | | -- `Distributed` 表用于分布式查询,数据存储在多个节点,无需共享磁盘。 |
| 93 | +## 四、最佳实践 |
| 94 | +### 4.1 数据建模建议 |
| 95 | +1. **分区策略**:按时间分区(如`toYYYYMMDD(event_date)`) |
| 96 | +2. **主键设计**:高频查询字段+时间列组合 |
| 97 | +3. **物化视图**:预计算加速聚合查询 |
| 98 | +4. **数据TTL**:自动清理过期数据 |
135 | 99 |
|
136 | | -### **🚀 StarRocks** |
137 | | -- 通过 **存算分离(Storage & Compute Separation)** 提供高扩展性。 |
138 | | -- 使用 **Colocation Join** 技术优化分布式查询,减少跨节点数据传输。 |
139 | | - |
140 | | ---- |
141 | | - |
142 | | - |
143 | | -## **🔹 适用场景** |
144 | | -✅ **Shared-Nothing 适用于**: |
145 | | -- **大规模数据分析(OLAP)**:ClickHouse、StarRocks、Hadoop。 |
146 | | -- **高并发查询**:日志分析、广告分析、金融数据。 |
147 | | -- **分布式存储 & 计算**:海量数据场景。 |
148 | | - |
149 | | -🚫 **不适用于**: |
150 | | -- **高频事务(OLTP)**:银行系统、订单处理(适合 Shared-Disk)。 |
151 | | -- **低延迟 JOIN 查询**:需要数据紧密存储的情况。 |
152 | | - |
153 | | ---- |
| 100 | +### 4.2 性能调优 |
| 101 | +- **压缩算法**:ZSTD(高压缩率) vs LZ4(高速度) |
| 102 | +- **索引粒度**:INDEX_GRANULARITY=8192(默认值) |
| 103 | +- **并行度**:max_threads参数配置 |
| 104 | +- **内存管理**:max_memory_usage限制 |
154 | 105 |
|
155 | | -## **🔹 总结** |
156 | | -Shared-Nothing **架构简单、可扩展、无共享瓶颈**,是 **大规模分布式数据库**(如 ClickHouse、StarRocks、Hadoop)广泛采用的设计。适用于 **大数据分析、高并发查询** 场景,但对于事务型应用(OLTP)可能不是最佳选择。 |
157 | | - |
158 | | -🚀 **如果你的业务需要处理 PB 级数据并进行高效分析,Shared-Nothing 是理想架构!** |
159 | | - |
160 | | - |
161 | | -## 表引擎 |
162 | | - |
163 | | -### MergeTree |
164 | | - |
165 | | -- ReplacingMergeTree :在数据合并期间删除排序键值相同的重复项。 |
166 | | -- CollapsingMergeTree :增加状态列`Sign`,主键相同,没成对的状态行保留,多线程情况下-1和1可能存在乱序,导致无法被删除。 |
167 | | -- VersionedCollapsingMergeTree : 为了解决CollapsingMergeTree乱序写入情况下无法正常折叠问题,新增一列`Version`,主键相同,且Version相同、Sign相反的行,在Compaction时会被删除。 |
168 | | -- SummingMergeTree : 把所有具有相同主键的行合并为一行,并根据指定的字段进行累加。 |
169 | | -- AggregatingMergeTree : SummingMergeTree只能累加,这个能进行各种聚合,需要指定聚合函数。 |
170 | | - |
171 | | -#### 功能 |
172 | | -- 按照主键排序 |
173 | | -- 如果指定了分区键,则可以使用分区 |
174 | | -- 支持数据复制 |
175 | | -- 支持数据采样 |
176 | | -- 并发/索引/分区/crud |
177 | | - |
178 | | -### Log |
179 | | - |
180 | | - 为了需要写入许多小数据量(少于一百万行)的表的场景而开发的。 |
181 | | - |
182 | | -#### 功能 |
183 | | -- 数据被顺序append写到磁盘上; |
184 | | -- 不支持delete、update; |
185 | | -- 不支持index; |
186 | | -- 不支持原子性写; |
187 | | -- insert会阻塞select操作。 |
| 106 | +### 4.3 典型用例 |
| 107 | +```sql |
| 108 | +-- 创建分布式表 |
| 109 | +CREATE TABLE hits_distributed ON CLUSTER cluster |
| 110 | +AS hits_local |
| 111 | +ENGINE = Distributed(cluster, default, hits_local, rand()); |
| 112 | + |
| 113 | +-- 使用AggregatingMergeTree |
| 114 | +CREATE MATERIALIZED VIEW view_name |
| 115 | +ENGINE = AggregatingMergeTree() |
| 116 | +ORDER BY (event_date) |
| 117 | +AS SELECT |
| 118 | + event_date, |
| 119 | + uniqState(user_id) AS uv |
| 120 | +FROM hits_local |
| 121 | +GROUP BY event_date; |
188 | 122 |
|
189 | | -### Integration |
| 123 | +``` |
190 | 124 |
|
191 | | - 该系统表引擎主要用于将外部数据导入到ClickHouse中,或者在ClickHouse中直接操作外部数据源。 |
| 125 | +## 主键索引(Primary Index) |
| 126 | +1. 核心概念 |
| 127 | +本质 :ClickHouse 的主键索引是稀疏索引 ,本质是数据排序的依据。 |
| 128 | +作用 :通过 ORDER BY 子句定义,决定数据在磁盘上的物理存储顺序。 |
| 129 | +查询加速 :通过跳过无关的数据块,减少 I/O 开销。 |
| 130 | +2. 创建方式 |
| 131 | +```sql |
| 132 | +-- 在建表时通过 ORDER BY 指定主键: |
| 133 | +CREATE TABLE example_table |
| 134 | +( |
| 135 | + event_time DateTime, |
| 136 | + user_id UInt32, |
| 137 | + metric_value Float64 |
| 138 | +) |
| 139 | +ENGINE = MergeTree() |
| 140 | +ORDER BY (event_time, user_id) -- 主键由 event_time 和 user_id 组成 |
| 141 | +PARTITION BY toYYYYMM(event_time); |
| 142 | +``` |
| 143 | +3. 特点 |
| 144 | +- 稀疏性 :索引标记(Index Granule)默认每 8192 行 存储一个标记。 |
| 145 | +- 非唯一性 :允许重复值,不强制唯一约束。 |
| 146 | +- 排序性 :数据按 ORDER BY 列的顺序物理存储。 |
192 | 147 |
|
193 | 148 | ## **1. 交易数据(Transactions)表结构** |
194 | 149 | 存储区块链上的所有交易记录,包括普通转账和智能合约调用。 |
|
0 commit comments