ClickHouse数据库二

标签: Clickhouse 分类: 数据库 创建时间:2019-12-23 08:38:21 更新时间:2024-11-15 10:49:43

1.性能分析及优化策略

像携程、字节跳动等公司,都在使用Clickhouse,并在其基础上,针对自身的业务场景进行了适度的优化与重写,使其能适应自身业务的增长以及数据的查询。其中用到的技术可能不仅仅局限于Clickhouse一个数据库,只有对相应的算法以及其他分布式系统原理,都有相当的了解,才能真正的实现Clickhouse数据库的落地。

压缩率

从一开始ClickHouse就支持多种方式的数据压缩:LZ4和ZSTD,默认情况下ClickHouse采用的是lz4压缩算法。一张图可以说明相关的问题(ES和clickhouse的压缩对比),这是新浪公司的人对相关的内容进行测试的结果。

使用SQL语句进行压缩率的查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- 查看数据库容量,以测试数据为参考
select
sum(rows) as "总行数",
formatReadableSize(sum(data_uncompressed_bytes)) as "原始大小",
formatReadableSize(sum(data_compressed_bytes)) as "压缩大小",
round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100, 0) "压缩率"
from system.parts;

-- 查询test表容量
select
table as "表名",
sum(rows) as "总行数",
formatReadableSize(sum(data_uncompressed_bytes)) as "原始大小",
formatReadableSize(sum(data_compressed_bytes)) as "压缩大小",
round(sum(data_compressed_bytes) / sum(data_uncompressed_bytes) * 100, 0) "压缩率"
from system.parts
-- 根据实际情况加查询条件
where table in('test')
group by table;

2.求最大最小值

参考文章:
1.min(x)计算

3.时间日期函数

1
2
3
4
5
6
/*查找在指定时间范围内的记录,并且id号为2778或者2779的记录
* toDateTime:将字符串转为时间,但是格式有要求
* parseDateTimeBestEffortOrNull:也是将数字类型参数解析为Date或DateTime类型。 与toDate和toDateTime不同,parseDateTimeBestEffort可以进行更复杂的日期格式。
*/
SELECT * FROM lsmfhx.realtime WHERE id in (27782779) and parseDateTimeBestEffortOrNull(RecordTime) BETWEEN toDateTime('2016-09-21 00:00:00') AND toDateTime('2016-09-21 24:00:00')

3.执行sql语句

1
clickhouse-client --password 密码 -d 数据库 --multiquery <  realtime.sql 

4.创建视图

1
CREATE view lsmfhx.v_realtime as select * from lsmfhx.realtime r left join lsmfhx.siteinfo s on r.SiteNo = s.SiteNo
参考文章:
1.CREATE VIEW

5.With和CTE(公用表达式)

在编写复杂的查询的时候,需要用到重复的SQL语句,所以能不能定义一个通用的变量呢?Clickhouse支持With语句,但是只能用于标量,我查了下,标量的意思就是只能是一个值。

Clickhouse supports WITH clause since mid 2017, but only for scalar values.

我尝试了一下,好像还真是可以

1
2
with concat(formatDateTime(RecordTime,'%Y%m%d'),toString(floor((toHour(RecordTime)*60+toMinute(RecordTime))/60-0.001))) as timeid
select timeid from lsmfhx.v_realtime

经过实验,with不能用在join语句中,也就是不能跨表使用。如下,会提示timeid不存在与b中,强行解释一波,可能是因为使用join的时候,已经是两张表了。

1
2
with concat(formatDateTime(RecordTime,'%Y%m%d'),toString(floor((toHour(RecordTime)*60+toMinute(RecordTime))/60-0.001))) as timeid
select timeid from lsmfhx.v_realtime as a inner join(select timeid form b) on b.t=a.t

6.升级

因为我的clickhouse-common-static是使用的rpm的方式安装的,所以我需要做的就是使用rpm方式升级。但是我下载了clickhouse-common-static最新版,执行了rpm -Uvh clickhouse-common-static-20.1.4.14-2.x86_64.rpm,结果显示这个包被别人依赖了。

于是我尝试通过yum的方式继续更新。你知道的,下载起来特别的慢。

1
2
3
4
5
6
7
## Debian/Ubuntu
$ sudo apt-get update
$ sudo apt-get install clickhouse-client clickhouse-server
$ sudo service clickhouse-server restart

## Yum
$ sudo yum update clickhouse-server clickhouse-client

所以最后我通过先把clickhouse-common-static-20.1.4.14-2.x86_64.rpm下载到服务器中(用梯子),然后使用:

1
2
3
4
## 指定本地包升级
sudo yum localupdate clickhouse-common-static-20.1.4.14-2.x86_64.rpm
## 重启
sudo service clickhouse-server restart

顺利解决了更新的问题。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。