ClickHouse数据库引擎

本文只记录MergeTree(合并树)与Distributed(分布式表), 其他表引擎想了解的话
官网传送门
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/

集群部署传送门
https://blog.csdn.net/xushijie89/article/details/123039704

OPTIMIZE命令


表引擎的一些特殊功能, 是在系统自动进行优化合并时发生的, 由于OPTIMIZE查询将读取和写入大量数据, 生产环境中禁止手动执行
optimize table table_name final;

MergeTree


特点:
1.支持索引
存储按主键排序的数据, 根据稀疏索引,更快地查找数据。

2.支持分区

3.支持数据复制
ReplicatedMergeTree表家族提供数据复制功能。

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
    ...
    INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
    INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2,
    ...
    PROJECTION projection_name_1 (SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY]),
    PROJECTION projection_name_2 (SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY])
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr
    [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx' [, ...] ]
    [WHERE conditions]
    [GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ]
[SETTINGS name=value, ...]

ENGINE — 引擎名称, MergeTree()引擎没有参数

ORDER BY — 排序, 必填, 如果没有指定PRIMARY KEY, 会使用此字段作为主键, 如果不需要排序, ORDER BY tuple()

PARTITION BY — 分区键, 一般情况按日期分区, PARTITION BY toYYYYMM(create_time), create_time字段需要为时间类型

PRIMARY KEY — 默认情况下,主键与排序键相同(排序键由ORDER By子句指定)。因此,在大多数情况下,没有必要指定一个单独的PRIMARY KEY子句。

SAMPLE BY — 抽样, 如果使用了抽样表达式,则主键必须包含它。抽样表达式的结果必须是一个无符号整数。例如:SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))。

TTL — 过期时间, 必须时间类型, TTL column + INTERVAL 1 DAY
规则的类型 DELETE|TO DISK ‘xxx’|TO VOLUME 'xxx’指定了当满足条件(到达指定时间)时所要执行的动作:移除过期的行,还是将数据片段移动到指定的磁盘(TO DISK ‘xxx’) 或 卷(TO VOLUME ‘xxx’)。默认的规则是移除(DELETE)。可以在列表中指定多个规则,但最多只能有一个DELETE的规则。

SETTINGS — 控制MergeTree行为的附加参数
详情参考
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/

ReplacingMergeTree


特点:
该引擎与MergeTree的不同之处在于,它删除具有相同排序键值的重复条目(是否重复由ORDER BY决定, 而不是PRIMARY KEY, PRIMARY KEY是可重复的)。

注意:
1.重复数据删除仅在合并时发生。合并发生在一个未知的时间, 通常是10-15分钟。
2.ReplacingMergeTree适用于在后台清除重复数据以节省空间,但不能保证没有重复。并且, 在分片的数据表中, 去重只能针对于当前分片

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

ReplacingMergeTree([ver])参数
ver:
带有版本号的ver列。类型UInt*,日期,DateTime或DateTime64。可选参数。
当合并时,从所有具有相同排序键的行替换mergetree只留下一个:
注意:
1.以ORDER BY作为去重标识
2.去重不能跨分区
3.同一批插入的数据会去重或分区合并时才会进行去重
4.数据保留版本字段值最大的
5.如果版本字段相同则保留最后插入的
6.所有列相同的数据是无法插入的

SummingMergeTree


特点:
当合并SummingMergeTree表的数据部分时,ClickHouse会将相同的ORDER BY,将包含数字类型的列汇总数据。如果ORDER BY的组成方式是单个键值对应大量的行,这将显著减少存储容量并加快数据选择。

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

复制表:
ReplicatedSummingMergeTree(’/clickhouse/tables/{shard}/table_name_sum2’, ‘{replica}’, (total_amount, total_1))

SummingMergeTree([columns])参数
columns:
具有列名的元组,其中的数字类型将被汇总。可选参数。列必须为数字类型,且不能在主键中。

注意:
1.以 SummingMergeTree()中指定的列作为汇总数据列
2.可以填写多列, 但必须数字列, 如果不填, 以所有非主键列且为数字类型的字段为汇总数据列
3.以 order by 的列为准,作为维度列
4.其他的列按插入顺序保留第一行
5.不在一个分区的数据不会被聚合
6.只有在同一批次插入(新版本)或分片合并时才会进行聚合
7.合并后非ORDER BY及非累计字段, 保留最初的值
8.新增的数据如果所有字段全部相同, 自动去重; 合并后的数据不影响

CollapsingMergeTree


特点:
如果排序键(ORDER BY)中的所有字段都相同,那么CollapsingMergeTree将异步删除成对的两行数据, 例如: 成对的条件是, 某字段1和-1。没有成对的行, 会保留

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
    sign Int8 
) ENGINE = CollapsingMergeTree(sign)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

sign:
字段需要有sign列, 字段类型Int8, 取值1为生效状态, 取值-1为取消状态

注意:
1.一般情况下更新时需要插入两行数据, 第一行取消数据先前的状态, 它应该复制ORDER BY关键字段, 并且sign为-1
第二行是最新状态
2.分片中不会进行合并
3.数据合并后, 在短时间内, 无法再插入之前的原始数据

VersionedCollapsingMergeTree


跟CollapsingMergeTree对比下, 新建字段时多了一个version字段, 字段类型UInt*, 相同版本之间的数据才会合并

AggregatingMergeTree


特点:
结合字段类型AggregateFunction使用, 该列在表中是以二进制形式存在
ClickHouse将相同ORDER BY的所有行, 字段类型为AggregateFunction的列, 替换为存储聚合函数状态组合的单行

create table db_name.table_name_agg on cluster cluster_3shards_2replicas
(
    id           UInt32,
    sku_id       String,
    spu_id       AggregateFunction(uniq,String),
    total_amount AggregateFunction(sum,UInt32),
    create_time  Datetime
) engine = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/table_name_agg', '{replica}')
      partition by toYYYYMMDD(create_time)
      primary key (id)
      order by (id, sku_id);

聚合函数方法汇总
https://clickhouse.com/docs/en/sql-reference/aggregate-functions/

数据插入:
插入数据时, 使用带有 聚合函数方法名+State(), 通过INSERT SELECT语句, 例如字段使用的函数是uniq, 插入时就是uniqState()

INSERT INTO TABLE table_name_agg SELECT 1, 'sku111', uniqState('spu111'), sumState(toUInt32(1000)), '2020-06-01 12:00:00';
INSERT INTO TABLE table_name_agg SELECT 1, 'sku111', uniqState('spu222'), sumState(toUInt32(2000)), '2020-06-01 12:00:00';
INSERT INTO TABLE table_name_agg SELECT 1, 'sku111', uniqState('spu333'), sumState(toUInt32(3000)), '2020-06-01 12:00:00';
INSERT INTO TABLE table_name_agg SELECT 1, 'sku111', uniqState('spu444'), sumState(toUInt32(4000)), '2020-06-01 12:00:00';

INSERT INTO TABLE table_name_agg SELECT 2, 'sku222', uniqState('spu555'), sumState(toUInt32(5000)), '2020-06-01 12:00:00';
INSERT INTO TABLE table_name_agg SELECT 2, 'sku222', uniqState('spu666'), sumState(toUInt32(6000)), '2020-06-01 12:00:00';

数据查询:
查询时, 使用带有 聚合函数方法名+Merge()

SELECT id, sku_id, uniqMerge(spu_id), sumMerge(total_amount) FROM table_name_agg GROUP BY id, sku_id;

在数据库工具DataGrid中, 可以直观的看到, 聚合列乱码且无法直接编辑
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值