MergeTree家族的表引擎是ClickHouse数据存储功能的核心。它们为恢复能力和高性能数据检索提供了大多数功能:列式存储、自定义分区、稀疏主索引、辅助数据跳过索引等。
基本MergeTree表引擎可以被认为是单节点ClickHouse实例的默认表引擎,因为它对于广泛的用例来说是通用和实用的。
对于生产使用来说,ReplicatedMergeTree是一个不错的选择,因为它为常规MergeTree引擎的所有特性增加了高可用性。另一个好处是在数据摄取时自动执行重复数据消除,因此如果插入过程中出现网络问题,软件可以安全地重试。
MergeTree系列的所有其他引擎都为某些特定的用例添加了额外的功能。通常,它在后台实现为额外的数据操作。
MergeTree引擎的主要缺点是它们的重量相当重。因此,典型的模式是没有这么多。如果需要许多小表,例如临时数据,请考虑日志引擎系列。
就相当于一个父类有最基本的那些功能,有特殊需求,可以使用它的子类:XXXMergeTree
支持功能
建表语句
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' [, ...] ]
[WHERE conditions]
[GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ]
[SETTINGS name=value, ...]
ENGINE:引擎的名称和参数.
ORDER BY:排序键
PARTITION BY:分区键
PRIMARY KEY—主键(如果它不同于排序键)
SAMPLE BY — 用于抽样的表达式。
TTL 指定行存储的持续时间并定义数据片段在硬盘和卷上的移动逻辑的规则列表。
DELETE|TO DISK ‘xxx’|TO VOLUME 'xxx’指定了当满足条件(到达指定时间)时所要执行的动作:移除过期的行,还是将数据片段(如果数据片段中的所有行都满足表达式的话)移动到指定的磁盘(TO DISK ‘xxx’) 或 卷(TO VOLUME ‘xxx’)
SETTINGS — 控制 MergeTree 行为的额外参数
例子
CREATE TABLE test.tables(
`order_id` UInt32,
`order_sn` String,
`date_added` UInt64
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(toDate(date_added))
ORDER BY order_sn
INSERT INTO test.tables
(order_id, order_sn, date_added)
VALUES(1, '11', 1608963927769);
//强制合并
optimize table test final;
//查看表的相关信息
SELECT
partition,
name,
active FROM system.parts WHERE table = 'test'
MergeTree 的不同之处在于它会删除排序键值相同的重复项。数据的去重只会在数据合并期间进行。合并前还是可以被查到。
该引擎要求在建表语句中指定一个标记列Sign,按照Sign的值将行分为两类:Sign=1的行称之为状态行,Sign=-1的行称之为取消行。再主键相同的情况下,每次需要新增状态时,写入一行状态行;需要删除状态时,则写入一行取消行。没有成对的行会被保留。
多线程情况下-1和1可能存在乱序,导致无法被删除
为了解决CollapsingMergeTree乱序写入情况下无法正常折叠问题,VersionedCollapsingMergeTree表引擎在建表语句中新增了一列Version,用于在乱序情况下记录状态行与取消行的对应关系。主键相同,且Version相同、Sign相反的行,在Compaction时会被删除。
当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,并根据指定的字段进行累加。
SummingMergeTree只能累加,这个能进行各种聚合,需要指定聚合函数
CREATE TABLE agg_table
( CounterID UInt8,
StartDate Date,
UserID AggregateFunction(uniq, UInt64)
) ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(StartDate)
ORDER BY (CounterID, StartDate);
这些引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的。
几种Log表引擎的共性是:
TinyLog,引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能。TinyLog 引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中。
Log和StripLog支持并发读取。每个线程处理一个单独的数据块。Log引擎每一列使用一个单独文件,Stripe Log保存在一个文件。Log引擎相对来说更加高效
写入许多小数据量(小于一百万行)的表的场景下使用这个引擎。
StripeLog 引擎不支持 ALTER UPDATE 和 ALTER DELETE 操作。
select的返回顺序不可预测
这些标记写在每个数据块上,并且包含偏移量,这些偏移量指示从哪里开始读取文件以便跳过指定的行数。写入操作会阻塞读取和其他写入。,不支持索引。
同样,如果写入表失败,则该表将被破坏,并且从该表读取将返回错误。Log引擎适用于临时数据,write-once 表以及测试或演示目的。
最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中。写入时,数据将附加到文件末尾。
该系统表引擎主要用于将外部数据导入到ClickHouse中,或者在ClickHouse中直接操作外部数据源。
Merge 引擎 (不要跟 MergeTree 引擎混淆) 本身不存储数据,但可用于同时从任意多个其他的表中读取数据。读是自动并行的,不支持写入。
Merge(hits, ‘^WatchLog’)
数据会从 hits 数据库中表名匹配正则 ‘^WatchLog’ 的表中读取。
File表引擎以一种受支持的文件格式(TabSeparated,Native等)将数据保存在文件中。读取其他系统生成的数据文件
写入Nulltable 数据被忽略,返回值也是空
数据集永远存在RAM中,不能重复
保存http/https上面的数据,很想FIle Engine
用于构建视图(有关更多信息,请参阅 CREATE VIEW 查询)。 它不存储数据,仅存储指定的 SELECT 查询。
Memory 引擎以未压缩的形式将数据存储在 RAM 中。数据完全以读取时获得的形式存储。读写操作不会相互阻塞。不支持索引。查询是并行化的。在简单查询上达到最大速率(超过10 GB /秒),因为没有磁盘读取,不需要解压缩或反序列化数据。重新启动服务器时,表中的数据消失,表将变为空。
缓冲数据写入 RAM 中,周期性地将数据刷新到另一个表。在读取操作时,同时从缓冲区和另一个表读取数据。
默认使用Atomic数据库引擎
MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换。
无法做的
将MySQL服务器中的表映射到ClickHouse中,将ClickHouse服务看作MySQL副本,它读取Binlog并执行DDL和DML请求。实现了基于MySQL Binlog机制的业务数据库实时同步功能。
CREATE DATABASE mysql ENGINE = MaterializeMySQL('localhost:3306', 'db', 'user', '***');
SHOW TABLES FROM mysql;
最后一次访问的多少秒内,将数据保存在内存中,只能和Log表一起使用
CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds);
它支持非阻塞DROP和RENAME TABLE查询以及原子交换表t1和t2查询。 默认情况下使用原子数据库引擎。
CREATE DATABASE test ENGINE = Atomic;
支持连接远程PostgreSQL数据库,并提供读写操作
CREATE DATABASE test_database
ENGINE = PostgreSQL('postgres1:5432', 'test_database', 'postgres', 'mysecretpassword', 1);
参考资料
官网