ClickHouse-MergeTree家族引擎

简介

MergeTree系列的表引擎是ClickHouse数据存储功能的核心。它们提供了用于弹性和高性能数据检索的大多数功能:列存储,自定义分区,稀疏的主索引,辅助数据跳过索引等。

基本MergeTree表引擎可以被认为是单节点ClickHouse实例的默认表引擎,因为它在各种用例中通用且实用。

对于生产用途,ReplicatedMergeTree是必经之路,因为它为常规MergeTree引擎的所有功能增加了高可用性。一个额外的好处是在数据提取时自动进行重复数据删除,因此如果插入过程中出现网络问题,该软件可以安全地重试。

MergeTree系列的所有其他引擎为某些特定用例添加了额外的功能。通常,它是作为后台的其他数据操作实现的。

MergeTree引擎的主要缺点是它们很重。因此,典型的模式是没有太多。如果您需要许多小表(例如用于临时数据),请考虑使用Log engine family

特点

存储按主键排序的数据。

这使您可以创建一个小的稀疏索引,以帮助更快地查找数据。

如果指定了分区键,则可以使用分区

ClickHouse支持的某些分区操作比对相同数据,相同结果的常规操作更有效。ClickHouse还会自动切断在查询中指定了分区键的分区数据。这也提高了查询性能。

数据复制支持。

ReplicatedMergeTree表族提供数据复制。有关更多信息.

数据采样支持。

如有必要,可以在表中设置数据采样方法。

1  MergeTree

1.基本格式

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) 

ENGINE = MergeTree()ORDER BY expr[PARTITION BY expr][PRIMARY KEY expr][SAMPLE BY expr][TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...][SETTINGS name=value, ...]

2.参数解读

ENGINE—引擎的名称和参数。ENGINE = MergeTree()。该MergeTree引擎没有参数。

ORDER BY —排序键

列名称或任意表达式的元组。范例:ORDER BY (CounterID, EventDate)。

如果PRIMARY KEY子句未明确定义主键,则ClickHouse会将排序键用作主键。

ORDER BY tuple()如果不需要排序,请使用语法。

PARTITION BY— 分区键。可选的。

要按月进行分区,请使用toYYYYMM(date_column)表达式,其中的date_column是日期类型为Date的列。此处的分区名称具有"YYYYMM"格式。

PRIMARY KEY—主键(与排序键)不同。可选的。

默认情况下,主键与排序键(由ORDER BY子句指定)相同。因此,在大多数情况下,无需指定单独的PRIMARY KEY子句。

SAMPLE BY—用于采样的表达式。可选的。

如果使用采样表达式,则主键必须包含它。范例:SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))。

TTL—规则列表,用于指定行的存储持续时间并定义磁盘和卷之间零件自动移动的逻辑。可选的。

结果必须有一个Date或一DateTime列。例:
TTL date + INTERVAL 1 DAY

规则的类型DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'指定了在满足表达式(达到当前时间)时要对零件执行的操作:删除过期的行,将零件(如果对零件中的所有行都满足表达式)移动到指定的磁盘(TO DISK 'xxx')或到音量(TO VOLUME 'xxx')。规则的默认类型为删除(DELETE)。可以指定多个规则的列表,但最多只能有一个DELETE规则。

SETTINGS—控制MergeTree(可选)行为的其他参数:

  1. index_granularity—索引标记之间的最大数据行数。默认值:8192。请参见数据存储
  2. index_granularity_bytes—数据粒度的最大大小(以字节为单位)。默认值:10Mb。要仅按行数限制颗粒大小,请设置为0(不建议)。请参阅数据存储
  3. enable_mixed_granularity_parts—启用或禁用过渡以通过index_granularity_bytes设置控制颗粒尺寸。在版本19.11之前,只有index_granularity用于限制颗粒大小的设置。index_granularity_bytes从具有大行(数十和数百MB)的表中选择数据时,此设置可提高ClickHouse性能。如果您的表具有大行,则可以为表启用此设置以提高SELECT查询效率。
  4. use_minimalistic_part_header_in_zookeeper— ZooKeeper中数据部件头的存储方法。如果为use_minimalistic_part_header_in_zookeeper=1,则ZooKeeper存储的数据较少。有关更多信息,请参阅“服务器配置参数”中的设置说明
  5. min_merge_bytes_to_use_direct_io—使用对存储磁盘的直接I / O访问所需的最小合并操作数据量。合并数据部分时,ClickHouse会计算要合并的所有数据的总存储量。如果卷超过min_merge_bytes_to_use_direct_io字节,ClickHouse将使用直接I / O接口(O_DIRECT选项)读取数据并将数据写入存储磁盘。如果为min_merge_bytes_to_use_direct_io = 0,则直接I / O被禁用。默认值:10 * 1024 * 1024 * 1024字节。
  6. merge_with_ttl_timeout—重复与TTL合并之前的最小延迟(以秒为单位)。默认值:86400(1天)。
  7. write_final_mark—启用或禁用在数据部分的末尾(最后一个字节之后)写入最终索引标记。默认值:1.不要关闭它。
  8. merge_max_bloCK_size—合并操作的块中的最大行数。默认值:8192
  9. storage_policy—存储策略。请参阅使用多个块设备进行数据存储
  10. min_bytes_for_wide_part,min_rows_for_wide_part—可以以Wide格式存储的数据部分中的最小字节/行数。您可以设置这些设置之一,全部或全部。请参阅数据存储

3.建表

create table tb_merge_tree(
id UInt8,
name String,
city String
)
engine = MergeTree
order by id;

4.添加数据

insert into tb_merge_tree values(1,'zss','BJ'),(2,'lss','SH');

  • 再次添加数据
insert into tb_merge_tree values(1,'ww','SD');

5.合并表

optimize table tb_merge_tree;

2  ReplacingMergeTree

这个引擎是在 MergeTree 的基础上,添加了“处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。有一些数据可能仍未被处理。因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。

1.建表

create table tb_replacing_merge_tree(
id UInt8,
name String,
city String,
version UInt8
)
engine = ReplacingMergeTree(version)
order by id;

2.添加数据

insert into tb_replacing_merge_tree values(1,'zss','BJ',20),(2,'lss','SH',20);

  • 再次添加数据
insert into tb_replacing_merge_tree values(1,'WW','SD',10);

3.合并数据

optimize table tb_replacing_merge_tree;

两表合并的时候去重了,将主键id重复的且版本号(version)小的删掉

4.存储位置

3  CollapsingMergeTree

ClickHouse实现了CollapsingMergeTree来消除ReplacingMergeTree的限制(只删除小版本字段的问题)。该引擎要求在建表语句中指定一个标记列Sign,后台Compaction时会将主键相同、Sign相反的行进行折叠,也即删除。
CollapsingMergeTree将行按照Sign的值分为两类:Sign=1的行称之为状态行,Sign=-1的行称之为取消行。
每次需要新增状态时,写入一行状态行;需要删除状态时,则写入一行取消行。
在后台Compaction时,状态行与取消行会自动做折叠(删除)处理。而尚未进行Compaction的数据,状态行与取消行同时存在。

sign—具有行类型的列的名称:1是“状态”行,-1是“取消”行。

1.建表

create table collapsing_merge_tree(
id UInt8,
name String,
city String,
sign Int8
)
engine = CollapsingMergeTree(sign)
order by id;

2.添加数据

insert into collapsing_merge_tree values(1,'zss34','BJ',1);
insert into collapsing_merge_tree values(1,'ww','BJ',-1);
insert into collapsing_merge_tree values(1,'lss','BJ',1);

3.合并表

optimize table collapsing_merge_tree;

此时折叠了第一条数据,在标记为-1下面的数据保留下来

4.改变添加数据顺序

insert into collapsing_merge_tree values(1,'zss34','BJ',1);
insert into collapsing_merge_tree values(1,'lss','BJ',1);
insert into collapsing_merge_tree values(1,'ww','BJ',-1);

  • 再次合并

看后自行体会!!!!!!!!!!!!!!!!

5.总结

CollapsingMergeTree虽然解决了主键相同的数据即时删除的问题,但是状态持续变化且多线程并行写入情况下,状态行与取消行位置可能乱序,导致无法正常折叠。只有保证老的状态行在在取消行的上面, 新的状态行在取消行的下面! 但是多线程无法保证写的顺序!

4  VersionedCollapsingMergeTree

取消字段和数据版本同时使用,避免取消行数据无法删除的问题

为了解决CollapsingMergeTree乱序写入情况下无法正常折叠问题VersionedCollapsingMergeTree表引擎在建表语句中新增了一列Version,用于在乱序情况下记录状态行与取消行的对应关系。主键相同,且Version相同、Sign相反的行,在Compaction时会被删除。

与CollapsingMergeTree类似, 为了获得正确结果,业务层需要改写SQL,将count()、sum(col)分别改写为sum(Sign)、sum(col * Sign)。

1.建表

create table versioned_collapsing_merge_tree(
id UInt8,
name String,
version UInt8,
sign Int8
)
engine = VersionedCollapsingMergeTree(sign,version)
order by id;

2.添加数据

insert into versioned_collapsing_merge_tree values (1,'zss',10,1),(2,'lss',10,1);
insert into versioned_collapsing_merge_tree values (1,'zss',10,-1);

\

3.合并数据

optimize table  versioned_collapsing_merge_tree;

4.存储位置

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值