Clickhouse系列之MergeTree讲解

161 阅读3分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

了解MergeTree家族

MergeTree它是Clickhouse的核心表引擎,在企业中使用最多的一种引擎。作为Clickhouse核心的数据存储功能,它不仅提供高性能的数据检索能力,而且还提供弹性的存储能力(自动编译分区,列式存储,辅助跳数索引以及稀疏索引等。)

从官方的例子可以看出来,Base MergeTree表引擎在单节点的Clickhouse中是作为一个default的引擎,但是在实际生产的过程中(尤其是企业级)ReplicatedMerge Tree是一种不错的表存储引擎,这个引擎它是MergeTree家族引擎成员,因此它继承了MergeTree的优点之外,它还新增了高可用等特性,除此之外,这个表引擎还在接受数据的时候自动进行数据重复消除,因此解决了Exactly-one的问题。

MergeTree除了刚刚所说的ReplicatedMerge之外,它还有其他表引擎,每一个都附带了其他的额外的功能(都是后台通过线程进行附加的操作)。

MergeTree的优点说了一大堆,但是它的场景还是有限的,比如数据量如果很小,或者是临时表这种,它就不适合,可以考虑用其他的引擎来替代。

MergeTree特点

MergeTree和其家族引擎是Clickhouse引擎中最好的表引擎。MergeTree家族引擎主要用于大量是数据的存储,数据的写入需要通过批量的写入,然后后台将这些数据进行合并,这种方法也是最高效的写入方式。现在我们来看看它有哪些特点:

  1. 存储按主键排序的数据。
  2. 这允许您创建一个小的稀疏索引,以帮助更快地查找数据。
  3. 如果指定了分区键,则可以使用分区。
  4. ClickHouse支持某些分区操作,这些分区操作比对相同数据执行的常规操作效率更高,结果也相同。ClickHouse还会自动切断查询中指定分区键的分区数据。
  5. 数据复制支持。
  6. ReplicatedMergeTree表系列提供数据复制。有关详细信息,请参阅数据复制。
  7. 数据采样支持。

MergeTree使用案例

在上面我们对MergeTree的特点进行了解,现在我们来看看实操。 1、索引使用,执行sql如下:

CREATE TABLE table_name  
(  
u64 UInt64,  
i32 Int32,  
s String,  
INDEX a (u64 * i32, s) TYPE minmax GRANULARITY 3,  
INDEX b (u64 * length(s)) TYPE set(1000) GRANULARITY 4  
) ENGINE = MergeTree()

image.png 上表使用了索引,我们来看看怎么利用索引?

SELECT count() FROM table WHERE s < 'z'  
SELECT count() FROM table WHERE u64 * i32 == 10 AND u64 * length(s) >= 1234

2、接下来了解下TTL的一个时候,这个在项目开发中也是经常用到(尤其在物联网领域,数据量庞大),字段的TTL执行sql如下:

CREATE TABLE example_table  
(  
d DateTime,  
a Int TTL d + INTERVAL 1 MONTH,  
b Int TTL d + INTERVAL 1 MONTH,  
c String  
)  
ENGINE = MergeTree  
PARTITION BY toYYYYMM(d)  
ORDER BY d;

image.png 表的TTL执行sql:

CREATE TABLE example_table  
(  
d DateTime,  
a Int  
)  
ENGINE = MergeTree  
PARTITION BY toYYYYMM(d)  
ORDER BY d  
TTL d + INTERVAL 1 MONTH [DELETE],  
d + INTERVAL 1 WEEK TO VOLUME 'aaa',  
d + INTERVAL 2 WEEK TO DISK 'bbb';

总结

MergeTree是一个很大范围的引擎,内容也包含很多,不仅在建表这些技术上,在集群搭建以及sql的书写都会有一点小区别,因此这里不做大的讲解,庞大的写不下这里,哈哈....详细的还是可以去官网看看,而且Clickhouse更新也快,因此很多知识点,即便现在讲解,下次使用也不一定奏效,所有特性都依赖其版本。