2020-10-28

最近需要使用clickhouse来做数据仓库,所以开始接触数据库clickhouse,下面是自己一些学习笔记。

1.什么是clickhouse?
官网描述:ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS).

第一次接触列式数据库,感觉单看概念还是比较抽象,难懂,思维很难转换的过来

对比一下olap和oltp的区别:
2020-10-28
从上面可以看出OLAP数据库特点就是数据量大,主要是查询操作,所以需保证查询速度快,所以一般OLAP一般采用列式数据库.

2.clickhouse的特征
官网上讲很多,这边就不细说(官网:https://clickhouse.tech/docs/zh/introduction/distinctive_features/)

真正的列式数据库管理系统 数据压缩 数据的磁盘存储 多核心并行处理 多服务器分布式处理 支持SQL 向量引擎 实时的数据更新 支持索引 适合在线查询 支持近似计算 支持数据复制和数据完整性

3.clickhouse引擎
clickhouse最大的特点就是引擎,一直强调clickhouse性能强悍,速度快,那么也要取决于引擎的选择是否正确,下文将着重介绍clickhouse的引擎(介绍几种常用的,其他使用不多就不多做介绍了,官网都有说明)

最常用的引擎:

MergeTree: MergeTree系列(*MergeTree)的引擎和其他引擎是最强大的ClickHouse表引擎,按照主键存储数据,可以进行分区,也支持复制,同时也支持数据采样.同时MergeTree是一个系列不同的引擎提供不同的特性,如:SummingMergeTree提供了数据的合并功能,ReplacingMergeTree也能够清除重复数据等

Distributed:该引擎不会自行存储任何数据,但是可以在多个服务器上面进行分布式查询,在正式环境分布式部署clickhouse后就需要采用这个引擎建立表来查询.

官网的描述中还有非常多的其他引擎,各具特色,这边只是抽取了两个使用范围最广的做了简单的解释

  1. 实战MergeTree
    初次接触这种列式数据库,只看文档还是觉得非常的抽象,直接实战撸起来,直接上服务器,一个命令:yum install clickhouse-server clickhouse-client 搞定!使用clickhouse-client就可以连接上数据库了.装完数据库由于有其他事情,所以后面才去正式的探索.

Clickhouse以高性能著称,那么它的速度有多快呢?安装完成肯定是想要立马感受下的,再次连上数据库,发现有一个mysql_db_reporting数据库,应该是其他的同事导进去的,那么我就写个sql查询下这个数据有多快:
2020-10-28

这个数据实在是预料之外啊,一百多万的数据查询了3点多秒,没发现哪里快了,这种不是动不动上十亿数据查询的这个速度实在有点对不起它的名号啊,是不是我的打开方式不对?

经过排查发现这个表的DDL语句的引擎指定是mysql,嗯?好像哪里不对,指定引擎还是mysql,上官网看看先,得到结果:

clickhouse确实支持mysql引擎,clickhouse本身自己定义为数据库管理系统,那么支持管理数据库,查看这个引擎的介绍发现,其实这种倒数据创建方式,本质上查询还是走的mysql数据库,clickhouse只是在数据查询查询出来后,做一个关联聚合,所以这个就解释通了,为什么这么慢的原因,如果需要真正体验的它的速度那么得选用MergeTree系列的引擎.

再试一次找了一张开发库120万表导入:

CREATE TABLE default.p_fact_register ENGINE = MergeTree ORDER BY FREGISTER_DATE_ID AS SELECT * FROM mysql(‘10.0.0.162:3306’, ‘reporting’, ‘p_fact_register’, ‘root’, ‘kingdee8349’)

很快就导入完成了,再试试查询结果:
2020-10-28
这个14ms才算是这个数据库的正常水平吧,但是毕竟才百万级数据,这个不能说明啥,后面搞一张千万级的表试试,我们正式数据最大的表也就千万级了,于是让dba在正式导了一张两千万的大表进来测试下性能,结果导入过程没有超过60s,现在查询一下试试
2020-10-28

两个sql语句,一个3ms,一个101ms,两千万的表快的令人发指,但是为啥第一个比第二个的速度还要快?按照关系型数据库,第一个扫描的数据应该是跟多的呀.

其实来到它数据分区存储目录就能发现问题:
2020-10-28

可以从中看到一个count.txt文件,里面就存储了当前分区存储的数据数量,所以这就解释为啥coun(*)这个操作的速度快令人难以想象,同时我们也能发现这些文件的存储结构就是每一列的字段值,这种存储方式与mysql的大不一样,看了这个存储方式突然发现更加能够理解这个列式是如何的存储了.

以上便是我第一次接触clickhouse做的实战和探索,很多东西官网上有的都没有细说,大家有兴趣可以看看官网,这篇文章主要是两点:

分享下clickhouse的实战,感受下clickhouse的速度

希望大家能够对理解列式数据库这个概念有帮助,在没有真正操作之前一直感觉这个比较抽象,也可能关系型数据使用太久了,思维固化了,经过这次算是对这个数据库有了个初步认识