ClickHouse使用分析

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/

git:github.com/ClickHouse/...

官网文档:clickhouse.com/docs/en/int...

推荐书籍《ClickHouse原理解析与应用实践.pdf》

相关推荐
盛派网络小助手2 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
∝请叫*我简单先生2 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
zquwei3 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
dessler3 小时前
Docker-run命令详细讲解
linux·运维·后端·docker
Q_19284999064 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
ZSYP-S4 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
Yuan_o_5 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
程序员一诺6 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
DT辰白6 小时前
如何解决基于 Redis 的网关鉴权导致的 RESTful API 拦截问题?
后端·微服务·架构