合并树引擎:MergeTree
一、引擎特点
(1)存储的数据按主键排序。
(2)如果指定了分区键的话,可以使用分区。
在相同数据集和相同结果集的情况下ClickHouse中某些带分区的操作会比普通操作更快。查询中指定了分区键时ClickHouse会自动截取分区数据。这也有效增加了查询性能。
(3)支持数据副本。ReplicatedMergeTree系列的表提供了数据副本功能。
(4)支持数据采样。
(5)Clickhouse对大小写敏感。
二、建表示例
CREATE TABLE db1.table1(
`c1` String comment 'c1',
`c2` Nullable(String) comment 'c2',
`c3` Int32 comment 'c3',
`c4` Decimal(10,2) comment 'c4'
)
ENGINE = MergeTree()
PARTITION BY c1
ORDER by (c1,c3)
SETTINGS index_granularity = 8192;
三、子句说明
ENGINE - 引擎名和参数。
ORDER BY — 排序键。可以是一组列的元组。
PARTITION BY — 分区键 ,可选项。要按月分区,可以使用表达式 toYYYYMM(date_column) ,这里的 date_column 是一个 Date 类型的列。
PRIMARY KEY - 如果要 选择与排序键不同的主键,在这里指定,可选项。默认情况下主键跟排序键(由 ORDER BY 子句指定)相同。
TTL - 指定行存储的持续时间并定义数据片段在硬盘和卷上的移动逻辑的规则列表,可选项。
副本引擎:ReplicatedMergeTree
一、引擎特点
在每个副本服务器上运行 CREATE TABLE 查询。将创建新的复制表,或给现有表添加新副本。
如果其他副本上已包含了某些数据,在表上添加新副本,则在运行语句后,数据会从其他副本复制到新副本。换句话说,新副本会与其他副本同步。
要删除副本,使用 DROP TABLE。但它只删除那个 – 位于运行该语句的服务器上的副本。
二、创建示例
CREATE TABLE cq_report_db.table2(
`c1` String comment 'c1',
`c2` Nullable(String) comment 'c2',
`c3` Int32 comment 'c3',
`c4` Decimal(10,2) comment 'c4'
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/table2','{replica}')geTree()
PARTITION BY c1
ORDER by (c1,c3)
SETTINGS index_granularity = 8192;
三、引擎说明
zoo_path — ZooKeeper中该表的路径
replica_name — ZooKeeper 中的该表的副本名称。
去重引擎:ReplacingMergeTree
一、引擎特点
该引擎和 MergeTree 的不同之处在于它会删除排序键值相同的重复项。
数据的去重只会在数据合并期间进行。
合并会在后台一个不确定的时间进行,因此你无法预先作出计划。
有一些数据可能仍未被处理。尽管你可以调用 OPTIMIZE 语句发起计划外的合并,但请不要依靠它,因为 OPTIMIZE 语句会引发对数据的大量读写。
二、去重副本引擎:ReplicatedReplacingMergeTree
建表语句:
CREATE TABLE cq_report_db.table2(
`c1` String comment 'c1',
`c2` Nullable(String) comment 'c2',
`c3` Int32 comment 'c3',
`c4` Decimal(10,2) comment 'c4'
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/table2','{replica}')
PARTITION BY c1
ORDER by (c1,c3)
SETTINGS index_granularity = 8192;
聚合引擎:SummingMergeTree
一、引擎特点
当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,行包含了被合并的行中具有数值数据类型的列的汇总值。
如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。
二、建表示例
CREATE TABLE cq_report_db.table3(
`c1` String comment 'c1',
`c2` String comment 'c2',
`c3` String comment 'c3'
)
ENGINE = SummingMergeTree(c1)
PARTITION BY c1
ORDER by (c1,c3)
SETTINGS index_granularity = 8192;