导入官方数据
去官网下载
上传至虚拟机
将文件解压到clickhouse自己的数据文件夹中
[root@spark01 data]# tar -xvf hits_v1.tar -C /var/lib/clickhouse
[root@spark01 data]# tar -xvf visits_v1.tar -C /var/lib/clickhouse
由于导入数据后会是root用户,所以得将用户进行修改,进入data和文件夹下修改用户
[root@spark01 data]# chown -R clickhouse:clickhouse /var/lib/clickhouse/data/datasets/
[root@spark01 data]# chown -R clickhouse:clickhouse /var/lib/clickhouse/metadata/datasets/
修改完后重启clickhouse服务
进入clickhouse就能发现多了一个数据库
子查询重复字段
当查询的字段中出现了相同的字段时,clickhouse会自动去重
优化后的语法:自动将UserID进行去重
谓词下推
当语句中含有group by时且只有having时,having会转换成where并将其提前运行
EXPLAIN SYNTAX SELECT UserID FROM hits_v1 GROUP BY UserID HAVING UserID =
'8585742290196126178';
在子查询中直接写where就行不用写having
优化后不会将提上来的where语句删除
优化后:
聚合计算外推
先将其聚合后再进行计算
EXPLAIN SYNTAX
SELECT sum(UserID * 2)
FROM visits_v1
优化后:
聚合函数消除
由于是根据UserID分组,所以max(UserID)没有意义,clickhouse会自动将其删除
EXPLAIN SYNTAX
SELECT
sum(UserID * 2),
max(VisitID),
max(UserID)
FROM visits_v1
GROUP BY UserID
标量替换
标量是一个固定的值
mysql中with…as的作用是生成一张临时表
将其转换成标量
三元运算优化
settings optimize_if_chain_to_multiif = 1;开启三元运算
EXPLAIN SYNTAX
SELECT number = 1 ? 'test1' : (number = 2 ? 'test2' : 'test3')
FROM numbers(10)
settings optimize_if_chain_to_multiif = 1;
优化结果: 其中multiIf为多行判断