Clickhouse总结
Q1: 选择ClickHouse的原因是什么?
--(1)采用列式存储
①在数据存储方面更容易进行数据压缩。节省磁盘空间。
②在一些聚合计算、计数、求和等操作效率更高。
③标准化的SQL语句,几乎覆盖所有SQL标准语法。
④多样化引擎,可以根据不同的需求,给表设置不同的引擎,常用的有MergeTree系列
我们用的是ReplacingMergeTree,可以保证数据表的幂等性
⑤高吞吐写入能力
Clickhouse采用预写日志的结构,数据是顺序写入,写入不可修改,数据写入后在后台Compaction。
⑥数据分区与线程级并行
Clickhouse将数据划分为多个Partition,Partition还能进一步划分为多个index granularity,然后通过多个CPU实现并行数据处理。
Q2: 行式存储和列式存储的区别是什么?
--(1)行式存储在查询一个人的所有属性的时候,比较快。
但是在查询所有人的年龄的时候,就需要不停查找,或者需要全表扫描才行
--(2)列式存储
①存储方面:每一列的数据类型都是相同的,针对数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,能够极大的提高数据压缩比重
②计算方面:对于某列的聚合、求和、计数等操作比较快
③数据压缩比更好了,一方面节省了磁盘空间,另一方面对于cache也有了更大的发挥空间。
Q3: ClickHouse中的数据类型:
--(1)整型
①有符号整型Int8 (-128~127)
Int16
Int32
Int64
②无符号整型UInt8 (0~255)
UInt16
UInt32
UInt64
--(2)浮点型
Float32
Float64
--(3)布尔型
1 (正确)
0 (错误)
--(4)Decimal32
Decimal64
Decimal128
--(5)字符串
String
--(6)枚举 Enum8
Enum16
--(7)时间类型
Date
Datetime
Datetime64
--(8)数组
Q4:ClickHouse的表引擎
--(1)TinyLog
以列文件的形式保存在磁盘上,不支持索引,没有并发控制。一般保存少量的小表,生产环境一般不用。
--(2)Memory
内存引擎,数据以未压缩的原始形式保存在内存当中。
--(3)MergeTree
支持索引和分区
create table test1(id UInt32, name String, dt DateTime) engine=MergeTree partition by toYYYYMMDD(dt) primary key(id) order by (id, name);
partition by 分区可以降低扫描范围,优化查询速度;如果不填只有一个分区;设置了分区会以分区为单位并行处理;数据会首先写入到一个临时分区,达到一定的时间会触发合并操作.
primary key 主键只是提供了一个一级索引,但不是唯一约束;clickhouse中的唯一标识通过where条件过滤;根据where条件进行二分查找,能够定位到对应的index granularity(索引粒度),避免全表扫描。
order by 设定了分区内的数据按照哪些字段顺序进行有序保存。必须和primary key的前缀字段相同
--(4)ReplacingMergeTree
多了一个去重的功能,分区内去重
create table test2(id UInt32, name String, dt DateTime) engine=ReplacingMergeTree(dt) partition by toYYYYMMDD(dt) primary key (id) order by (id, name)
ReplacingMergrTree()填入的参数是版本字段,重复数据保留版本字段值最大的,如果不填版本字段,默认按照插入顺序保留最后一条。
--(5)SummingMergeTree
预聚合的引擎