1、ClickHouse
1.1、SQL 操作
这里只介绍一些和我们之前 MySQL 不同的语法;
1.1.1、Update 和 Delete
ClickHouse 提供了 Delete 和 Update 的能力,这类操作被称为 Mutation 查询(可变查询),它可以看 做 Alter 的一种。
虽然可以实现修改和删除,但是和一般的 OLTP 数据库不一样,Mutation 语句是一种很 “重”的操作,而且不支持事务。
“重”的原因主要是每次修改或者删除都会导致放弃目标数据的原有分区,重建新分区。 所以尽量做批量的变更,不要进行频繁小数据的操作。
由于操作比较“重”,所以 Mutation 语句分两步执行,同步执行的部分其实只是进行新增数据新增分区和并把旧分区打上逻辑上的失效标记。直到触发分区合并的时候,才会删除旧数据释放磁盘空间,一般不会开放这样的功能给用户,由管理员完成。
1)删除操作
语法:
alter table order_info_5 delete where id = '101';
查看数据目录:
2)修改操作
alter table table_name update total_amount = toDecimal32(2000.0,2) where id = '102';
再次查看数据目录:
可以看到,刚刚删除数据之后目录已经被自动合并,但是现在我们更新操作之后,它并不是在原本的数据之上直接更新,而是把更新后数据写入到一个新的目录!所以我们说它是一个重量级的操作;
优化思路
正因为删除和更新操作太过重量级,会发生大量的磁盘 IO,所以我们可以给它加一个标记字段:
- _isDelete:如果为 0 代表删除,如果为 1 代表可以被访问。
- _version:更新操作都改用插入完成,只是对版本+1
这样我们只需要在使用的时候加个过滤即可
1.1.2、多维分析
ck 的查询和标准 SQL 差别不大:
- 支持子查询
- 支持 CTE(with ... as 语法)
- 支持 join,但是不建议使用
- 窗口函数
多维分析指的就是从多个维度进行分析,不同的聚合逻辑的粒度是不同的,所以分析结果也是不同的,比如学生总成绩:
- 如果 group by 学校,就可以得到每个学校每个班级的总成绩
- 如果 group by 学生,得到的就是各个学校总成绩
多维分析,从 SQL 中体现就是这样:
select xxx from xxx group by a,b
union all
select xxx from xxx group by a
union all
select xxx from xxx group by b
union all
select xxx from xxx
当维度非常多的时候,n 个维度有 2^n 个组合,我们不可能自己手写出来,所以 ck 在 group by 语句后面提供了 with rollup\with cube\with tota;
同样,