这是一本可帮助读者深度理解并全面掌握ClickHouse运行原理并进行实践开发的工具书,涵盖了ClickHouse的时代背景、发展历程、核心概念、基础功能、运行原理、实践指导等多个维度的内容,尤其是在ClickHouse最核心的部分——MergeTree表引擎与分布式方面,书中对其实现原理和应用技巧进行了详细解读。
本书采用浅显易懂的语言+大量演示案例+大量示意图例的形式呈现,以求让读者在最短的时间内,以最舒服的方式,获得最核心的知识。本书的理论观点来自作者在OLAP领域10余年的工作思考与总结;功能与实操的素材来自作者在工作中对ClickHouse的深度应用与实践;原理解析部分的素材来自对大量专业文献的钻研与源码级的调试与解读。
本书在逻辑上分为三大部分:
第1~2章从宏观的角度出发,描述了时代背景、ClickHouse的发展历程及其核心特点。其中,对MOLAP、ROLAP和HOLAP三种架构形态的优缺点进行了详细解读,对ClickHouse的发展历程和架构形态进行了深度剖析,目的是帮助读者从根本上了解ClickHouse为什么具有这么高的性能。
第3~5章从实践应用的角度出发,详细介绍了ClickHouse基础功能的使用方法和技巧,其中包括对数据库、数据表、视图、数据字典等重点功能的剖析和演示。
第6~11章从原理的角度出发,解析了ClickHouse核心功能的运行机理。重点介绍了六大类数十种表引擎的主要特点与使用方法。其中对MergeTree的原理进行了深度解析,对它的基础数据结构、分区索引、一级索引、二级索引、压缩数据块、数据标记等重要概念进行了解读;对副本与分片的运行原理也进行了详细剖析;对它的基础数据结构、分布式DDL、分布式协同的核心操作过程等进行了解读。
目 录 Contents
推荐序一
推荐序二
推荐序三
推荐序四
推荐序五
赞誉
前言
第1章 ClickHouse的前世今生1
1.1 传统BI系统之殇2
1.2 现代BI系统的新思潮2
1.3 OLAP常见架构分类4
1.4 OLAP实现技术的演进6
1.5 一匹横空出世的黑马7
1.5.1 天下武功唯快不破8
1.5.2 社区活跃8
1.6 ClickHouse的发展历程8
1.6.1 顺理成章的MySQL时期9
1.6.2 另辟蹊径的Metrage时期10
1.6.3 自我突破的OLAPServer时期10
1.6.4 水到渠成的ClickHouse时代11
1.7 ClickHouse的名称含义12
1.8 ClickHouse适用的场景12
1.9 ClickHouse不适用的场景13
1.10 有谁在使用ClickHouse13
1.11 本章小结13
第2章 ClickHouse架构概述14
2.1 ClickHouse的核心特性14
2.1.1 完备的DBMS功能15
2.1.2 列式存储与数据压缩15
2.1.3 向量化执行引擎16
2.1.4 关系模型与SQL查询17
2.1.5 多样化的表引擎18
2.1.6 多线程与分布式18
2.1.7 多主架构19
2.1.8 在线查询19
2.1.9 数据分片与分布式查询 19
2.2 ClickHouse的架构设计20
2.2.1 Column与Field20
2.2.2 DataType20
2.2.3 Block与Block流21
2.2.4 Table22
2.2.5 Parser与Interpreter22
2.2.6 Functions 与Aggregate Functions22
2.2.7 Cluster与Replication23
2.3 ClickHouse为何如此之快24
2.3.1 着眼硬件,先想后做24
2.3.2 算法在前,抽象在后24
2.3.3 勇于尝鲜,不行就换25
2.3.4 特定场景,特殊优化25
2.3.5 持续测试,持续改进25
2.4 本章小结26
第3章 安装与部署27
3.1 ClickHouse的安装过程27
3.1.1 环境准备27
3.1.2 安装ClickHouse28
3.2 客户端的访问接口31
3.2.1 CLI31
3.2.2 JDBC33
3.3 内置的实用工具35
3.3.1 clickhouse-local35
3.3.2 clickhouse-benchmark36
3.4 本章小结38
第4章 数据定义39
4.1 ClickHouse的数据类型39
4.1.1 基础类型40
4.1.2 复合类型45
4.1.3 特殊类型48
4.2 如何定义数据表49
4.2.1 数据库49
4.2.2 数据表50
4.2.3 默认值表达式52
4.2.4 临时表53
4.2.5 分区表54
4.2.6 视图55
4.3 数据表的基本操作56
4.3.1 追加新字段56
4.3.2 修改数据类型56
4.3.3 修改备注56
4.3.4 删除已有字段57
4.3.5 移动数据表57
4.3.6 清空数据表58
4.4 数据分区的基本操作58
4.4.1 查询分区信息58
4.4.2 删除指定分区58
4.4.3 复制分区数据59
4.4.4 重置分区数据60
4.4.5 卸载与装载分区60
4.4.6 备份与还原分区61
4.5 分布式DDL执行61
4.6 数据的写入61
4.7 数据的删除与修改63
4.8 本章小结64
第5章 数据字典65
5.1 内置字典65
5.1.1 内置字典配置说明65
5.1.2 使用内置字典67
5.2 外部扩展字典67
5.2.1 准备字典数据67
5.2.2 扩展字典配置文件的元素组成68
5.2.3 扩展字典的数据结构69
5.2.4 扩展字典的类型71
5.2.5 扩展字典的数据源79
5.2.6 扩展字典的数据更新策略84
5.2.7 扩展字典的基本操作85
5.3 本章小结87
第6章 MergeTree原理解析88
6.1 MergeTree的创建方式与存储结构89
6.1.1 MergeTree的创建方式89
6.1.2 MergeTree的存储结构91
6.2 数据分区93
6.2.1 数据的分区规则93
6.2.2 分区目录的命名规则94
6.2.3 分区目录的合并过程95
6.3 一级索引98
6.3.1 稀疏索引98
6.3.2 索引粒度99
6.3.3 索引数据的生成规则99
6.3.4 索引的查询过程101
6.4 二级索引102
6.4.1 granularity与index_granularity的关系104
6.4.2 跳数索引的类型105
6.5 数据存储106
6.5.1 各列独立存储106
6.5.2 压缩数据块106
6.6 数据标记109
6.6.1 数据标记的生成规则109
6.6.2 数据标记的工作方式110
6.7 对于分区、索引、标记和压缩数据的协同总结113
6.7.1 写入过程113
6.7.2 查询过程114
6.7.3 数据标记与压缩数据块的对应关系114
6.8 本章小结116
第7章 MergeTree系列表引擎117
7.1 MergeTree117
7.1.1 数据TTL117
7.1.2 多路径存储策略121
7.2 ReplacingMergeTree128
7.3 SummingMergeTree130
7.4 AggregatingMergeTree134
7.5 CollapsingMergeTree137
7.6 VersionedCollapsingMergeTree140
7.7 各种MergeTree之间的关系总结141
7.7.1 继承关系141
7.7.2 组合关系143
7.8 本章小结144
第8章 其他常见类型表引擎145
8.1 外部存储类型145
8.1.1 HDFS145
8.1.2 MySQL149
8.1.3 JDBC150
8.1.4 Kafka152
8.1.5 File157
8.2 内存类型158
8.2.1 Memory159
8.2.2 Set159
8.2.3 Join160
8.2.4 Buffer162
8.3 日志类型164
8.3.1 TinyLog164
8.3.2 StripeLog165
8.3.3 Log166
8.4 接口类型167
8.4.1 Merge167
8.4.2 Dictionary168
8.4.3 Distributed169
8.5 其他类型170
8.5.1 Live View170
8.5.2 Null171
8.5.3 URL171
8.6 本章小结173
第9章 数据查询174
9.1 WITH子句175
9.2 FROM子句177
9.3 SAMPLE子句178
9.4 ARRAY JOIN子句180
9.5 JOIN子句183
9.5.1 连接精度184
9.5.2 连接类型186
9.5.3 多表连接189
9.5.4 注意事项190
9.6 WHERE与PREWHERE子句190
9.7 GROUP BY子句193
9.7.1 WITH ROLLUP194
9.7.2 WITH CUBE194
9.7.3 WITH TOTALS195
9.8 HAVING子句195
9.9 ORDER BY子句197
9.10 LIMIT BY子句198
9.11 LIMIT子句199
9.12 SELECT子句200
9.13 DISTINCT子句200
9.14 UNION ALL子句202
9.15 查看SQL执行计划203
9.16 本章小结207
第10章 副本与分片208
10.1 概述208
10.2 数据副本209
10.2.1 副本的特点212
10.2.2 ZooKeeper的配置方式212
10.2.3 副本的定义形式213
10.3 ReplicatedMergeTree原理解析214
10.3.1 数据结构215
10.3.2 副本协同的核心流程217
10.4 数据分片228
10.4.1 集群的配置方式228
10.4.2 基于集群实现分布式DDL232
10.5 Distributed原理解析236
10.5.1 定义形式236
10.5.2 查询的分类237
10.5.3 分片规则238
10.5.4 分布式写入的核心流程239
10.5.5 分布式查询的核心流程245
10.6 本章小结251
第11章 管理与运维252
11.1 用户配置252
11.1.1 用户profile252
11.1.2 配置约束253
11.1.3 用户定义254
11.2 权限管理257
11.2.1 访问权限257
11.2.2 查询权限258
11.2.3 数据行级权限259
11.3 熔断机制261
11.4 数据备份263
11.4.1 导出文件备份263
11.4.2 通过快照表备份264
11.4.3 按分区备份264
11.5 服务监控265
11.5.1 系统表266
11.5.2 查询日志267
11.6 本章小结270