1.安装与使用
1.1 单机快速下载
curl https:``//clickhouse.com/ | sh
会根据系统下载一个四百多M大小的可执行文件,然后通过以下命令进行启动
go
`启动服务`
`./clickhouse server`
`启动客户端`
`./clickhouse client`
这种方法不会生成全局可执行文件,也没有users.xml配置文件
1.2 使用安装包
官网为不同系统都提供了安装包,在官网找到适合的安装包即可下载,我们的linux服务器可以下载rpm或者tgz的安装包
安装包有四个文件
clickhouse-common-static
--- ClickHouse编译的二进制文件。clickhouse-server
--- 创建clickhouse-server
软连接,并安装默认配置服务clickhouse-client
--- 创建clickhouse-client
客户端工具软连接,并安装客户端配置文件。clickhouse-common-static-dbg
--- 带有调试信息的ClickHouse二进制文件。
全部下载解压执行文件中的安装脚本。
也可以使用yum命令进行安装
csharp
yum install -y yum-utils
yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
yum install -y clickhouse-server clickhouse-client
/etc/init.d/clickhouse-server start //运行服务器
clickhouse-client //运行客户端
安装后的相关目录
markdown
# 命令目录
/usr/bin
ll |grep clickhouse
-------------------------------------------
# 配置文件目录
cd /etc/clickhouse-server/
-------------------------------------------
# 日志目录
cd /var/log/clickhouse-server/
-------------------------------------------
# 数据文件目录
cd /var/lib/clickhouse/
-------------------------------------------
在配置文件目录下有config.xml和users.xml
config.xml可以配置服务器相关配置
users.xml可以配置用户权限
总体来说安装非常简单
1.3 可视化工具
通过clickhouse client可以执行sql,也可以使用可视化工具DBeaver,下载地址dbeaver.io/
idea也可以连接clickhouse
2.核心特性与适用场景
ClickHouse是一款MPP(大规模并行处理)架构的列式存储数据库,其具有ROLAP、在线实时查询、完整的DBMS、列式存储、不需要任何数据预处理、
支持批量更新、拥有非常完善的SQL支持和函数、支持高可用、不依赖Hadoop复杂生态、开箱即用等许多特点。
2.1 OLAP
OLAP名为联机分析,它指的是通过多种不同的维度审视数据,进行深层次分析。
有几种分类,大致分为ROLAP(Relational OLAP,关系型OLAP),
第二类架构称为MOLAP(Multidimensional OLAP,多维型OLAP) ,
其核心思想是借助预先聚合结果,使用空间换取时间的形式最终提升查询性能,
第三类架构称为HOLAP(Hybrid OLAP,混合架构的OLAP)是ROLAP和MOLAP两者的集成。
ClickHouse就是既使用ROLAP模型,同时又拥有比肩MOLAP的性能。
2.2 列式数据库
列式存储和数据压缩,对于一款高性能数据库来说是必不可少的特性。想让查询变得更快,最简单且有效的方法是减少数据扫描范围和数据传输时的大小,
而列式存储和数据压缩就可以帮助我们实现上述两点。按列存储与按行存储相比,前者可以有效减少查询时所需扫描的数据量。
这里有官网的示例图片,可以更直观的理解这两种方式对于OLAP场景的差异。
2.3 向量化引擎
为了实现向量化执行,需要利用CPU的SIMD指令。SIMD的全称是Single Instruction Multiple Data,即用单条指令操作多条数据。
它是通过数据并行以提高性能的一种实现方式,在CPU寄存器层面实现数据的并行操作。
ClickHouse目前利用SSE4.2指令集实现向量化执行。
安装前需要检查是否支持指令集
bash
linux
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
mac
sysctl -a | grep machdep.cpu.features
2.4 其他特性
ClickHouse使用关系模型并完全使用SQL作为查询语言,使得它易于上手
多线程与分布式:多线程处理提升性能,但是不支持事务,所以也没有隔离级别
2.5 ClickHouse适用的场景
它基本能够胜任各种数据分析类的场景,并且随着数据体量的增大,它的优势也会变得越为明显
2.6 ClickHouse不适用的场景
不支持事务。
不擅长根据主键按行粒度进行查询(虽然支持),故不应该把ClickHouse当作Key-Value数据库使用。
不擅长按行删除数据(虽然支持)
3.数据结构
在众多的表引擎中MergeTree表引擎及其家族系列(*MergeTree)最为强大,下面介绍一下该引擎的一些特性。
3.1 文件结构
3.2 分区
每个分区就相当于一个文件夹,可以通过partition by指定分区的字段,不指定的话会默认生成all分区。
伴随着每一批数据的写入(一次INSERT语句),MergeTree都会生成一批新的分区目录,即便不同批次写入的数据属于相同分区,
也会生成不同的分区目录,在写入后的10-15分钟通过后台任务将属于相同分区的目录合并,旧目录之后也会被后台任务删除。
3.3 列式存储与数据压缩
每个列字段都独立存储,有一个对应的.bin文件,按列独立存储的好处可以更好的数据压缩,还能缩小数据的扫描范围
数据经过压缩按照order by(类似主键)的顺序排列,按照压缩数据块的形式写入.bin文件中,每个压缩块的大小控制在64KB-1MB,
虽然数据被压缩后能够有效减少数据大小,降低存储空间并加速数据传输效率,但数据的压缩和解压动作,
其本身也会带来额外的性能损耗,所以要控制被压缩数据的大小,在性能损耗和压缩率之间寻求一种平衡,
而且通过数据块读取,可以不用读取整个.bin文件,缩小数据读取范围。
3.4 索引
3.4.1 一级索引
主键定义之后,MergeTree会为数据表生成一级索引primary.idx文件。索引是稀疏索引,按照默认粒度记录一段数据,
仅需使用少量的索引标记就能够记录大量数据的区间位置信息,且数据量越大优势越为明显。因为占用空间少,所以一级索引常驻内存,读取极快。
3.4.2 二级索引
比一级索引范围大一些,相当于一级索引范围的granularity参数倍,二级索引中主要是存储这一段数据的特征,来达到快速跳过无用数据快。
共有四种类型,比如可以保存数据的最大最小值(minmax),数据的去重值(set),或者几列的布隆过滤器(ngrambf_v1,tokenbf_v1)。
3.5 数据标记
数据标记存在.mrk文件,存储索引与数据块的对应关系,即每个数据块的偏移量,通过这个偏移量,在查询某一列数据时可以不用读取整个文件,
可以根据需要只加载有需要的数据块。解压缩数据块之后,可以继续使用数据标记读取指定一段。
3.6 结构优势
在数据的查询过程中,MergeTree首先可以依次借助分区索引、一级索引和二级索引,将数据扫描范围缩至最小。然后再借助数据标记,将需要解
压与计算的数据范围缩至最小。如果一条查询语句没有指定任何WHERE条件,或是指定了WHERE条件,但条件没有匹配到任何索引,虽然不能减少
数据读取范围,但是仍能通过数据标记多线程读取各个压缩数据块,以提升性能。
3.7 其他引擎
mergeTree系列引擎
引擎名 | 特点 | 场景 |
---|---|---|
MergeTree | 数据分区、一级索引和二级索引 | 最为常用 |
ReplacingMergeTree | 主键却没有唯一键的约束 | 用户并不希望数据表中含有重复的数据 |
SummingMergeTree | 按照预先定义的条件聚合汇总数据 | 用户只需要查询数据的汇总结果 |
AggregatingMergeTree | 将需要聚合的数据预先计算出来,并将结果保存起来 | 空间换时间 |
CollapsingMergeTree | 支持对已经存在的数据实现行级粒度的修改或删除通过定义一个sign标记位字段,记录数据行的状态但是折叠不是实时,写入数据需要按序才能折叠 | 数据修改或删除 |
VersionedCollapsingMergeTree | 对数据的写入顺序没有要求的CollapsingMergeTree | 升级版折叠表 |
还有其他引擎
外部存储系列的表引擎,能够直接读取其他系统的数据,ClickHouse自身只负责元数据管理,类似使用外挂表的形式;
内存系列的表引擎,能够充当数据分发的临时存储载体或消息通道;
日志文件系列的表引擎,拥有简单易用的特点;
接口系列表引擎,能够串联已有的数据表,起到黏合剂的作用
3.8 常用sql
SELECT
select column from table; |
---|
如果表中有100个字段使用select * 性能将相差100倍
SAMPLE
子句,可以实现数据采样功能,需要创建表时指定sample by
例:select id from table sample 0.1
JOIN
INNER JOIN
,只返回匹配的行。LEFT OUTER JOIN
,除了匹配的行之外,还返回左表中的非匹配行。RIGHT OUTER JOIN
,除了匹配的行之外,还返回右表中的非匹配行。FULL OUTER JOIN
,除了匹配的行之外,还会返回两个表中的非匹配行。CROSS JOIN
,产生整个表的笛卡尔积, "join keys" 是 不 指定。
连接精度- all 全部结果
- any 只匹配一条
- asof 模糊连接,可以将比较接近的记录连接到一起
例:SELECT count() FROM table_1 ASOF LEFT JOIN table_2 ON table_1.a == table_2.b AND table_2.t <= table_1.t
聚合函数
GROUP BY
可以使用以下函数
- count
- any 选择第一个遇到的值
- max 选择最大值
- min 选择最小值
- avg 算数平均值,仅支持数字
- anyHeavy 列出现频繁的值
- anylast 选出最后出现的一个值
- argMin 选出最小值对应的一行的另一个字段值
select (arg, value) from table; 选出value最小对应的arg - topK(num)(col) 出现频率最多的num个值
- groupArray 将结果聚合到数组中
select int_2,groupArray(str_1) from ck_test group by int_2 order by int_2; - groupUniqArray 生成的数组去重
- groupArraySample(max_size)(arg) 生成采样数组
- uniq 计算字段去重后的近似数量
- uniqExact 计算不同参数值的准确数量
- uniqCombined 计算不同参数值的近似数量 比uniq精度高,消耗内存多
- quantile(level)(arg) 计算近似分位数 比如level=0.5 取得是中位数
- quantiles(level1,level2...)(arg) 可以同时计算多个分位数,返回结果为数组
聚合查询还可以配合以下修饰符获取额外的汇总信息
- WITH ROLLUP
相当于
group by
group by a
group by a , b
- WITH CUBE
相当于
group by
group by a
group by b
group by a , b - WITH TOTALS
相当于
group by a , b
group by
4.性能分析
1百万数据量
sql | mysql | clickhouse |
---|---|---|
insert一条 | 0.002s | 0.007s |
insert1000条 | 0.030s | 0.365s |
select一条 | 0.000s | 0.001s |
select200条 | 0.001s | 0.004s |
分组求平均值 | 1.775s | 0.021s |
分组求最大值 | 1.920s | 0.017s |
数据大小 | 6.4M | 161M |
1千万数据量
sql | mysql | clickhouse |
---|---|---|
insert一条 | 0.003s | 0.005s |
insert1000条 | 0.033s | 0.247s |
select一条 | 0.001s | 0.028s |
select200条 | 0.004s | 0.030s |
分组求平均值 | 144.6s | 0.126s |
分组求最大值 | 22.107s | 0.057s |
数据大小 | 74M | 1.2G |
1亿数据量
sql | mysql | clickhouse |
---|---|---|
insert一条 | 0.023s | 0.047s |
insert1000条 | 0.048s | 0.500s |
select一条 | 0.004s | 0.069s |
select200条 | 0.016s | 0.033s |
分组求平均值 | 7m11s | 0.020s |
分组求最大值 | 11m15s | 0.032s |
分组求最大值 | 736M | 14G |
官网上与其他数据库对比 benchmark.clickhouse.com/
官网文档:clickhouse.com/docs/en/int...
推荐书籍《ClickHouse原理解析与应用实践.pdf》