本文正在参加「技术专题19期 漫谈数据库技术」活动
了解MergeTree家族
MergeTree它是Clickhouse的核心表引擎,在企业中使用最多的一种引擎。作为Clickhouse核心的数据存储功能,它不仅提供高性能的数据检索能力,而且还提供弹性的存储能力(自动编译分区,列式存储,辅助跳数索引以及稀疏索引等。)
从官方的例子可以看出来,Base MergeTree表引擎在单节点的Clickhouse中是作为一个default的引擎,但是在实际生产的过程中(尤其是企业级)ReplicatedMerge Tree是一种不错的表存储引擎,这个引擎它是MergeTree家族引擎成员,因此它继承了MergeTree的优点之外,它还新增了高可用等特性,除此之外,这个表引擎还在接受数据的时候自动进行数据重复消除,因此解决了Exactly-one的问题。
MergeTree除了刚刚所说的ReplicatedMerge之外,它还有其他表引擎,每一个都附带了其他的额外的功能(都是后台通过线程进行附加的操作)。
MergeTree的优点说了一大堆,但是它的场景还是有限的,比如数据量如果很小,或者是临时表这种,它就不适合,可以考虑用其他的引擎来替代。
MergeTree特点
MergeTree和其家族引擎是Clickhouse引擎中最好的表引擎。MergeTree家族引擎主要用于大量是数据的存储,数据的写入需要通过批量的写入,然后后台将这些数据进行合并,这种方法也是最高效的写入方式。现在我们来看看它有哪些特点:
- 存储按主键排序的数据。
- 这允许您创建一个小的稀疏索引,以帮助更快地查找数据。
- 如果指定了分区键,则可以使用分区。
- ClickHouse支持某些分区操作,这些分区操作比对相同数据执行的常规操作效率更高,结果也相同。ClickHouse还会自动切断查询中指定分区键的分区数据。
- 数据复制支持。
- ReplicatedMergeTree表系列提供数据复制。有关详细信息,请参阅数据复制。
- 数据采样支持。
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()
上表使用了索引,我们来看看怎么利用索引?
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;
表的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更新也快,因此很多知识点,即便现在讲解,下次使用也不一定奏效,所有特性都依赖其版本。