MergeTree¶家族 (LSM-Tree 数据结构)
Replicated(副本)+ MergeTree等 = ReplicatedMergeTree
-
MergeTree :
-
ReplacingMergeTree : 在后台数据合并期间,对具有相同排序键的数据进行去重操作。
-
SummingMergeTree : 当合并数据时,会把具有相同主键的记录合并为一条记录。根据聚合字段设置,该字段的值为聚合后的汇总值,非聚合字段使用第一条记录的值,聚合字段类型必须为数值类型。
-
AggregatingMergeTree : 在同一数据分区下,可以将具有相同主键的数据进行聚合。
-
CollapsingMergeTree : 在同一数据分区下,对具有相同主键的数据进行折叠合并。
-
VersionedCollapsingMergeTree : 基于CollapsingMergeTree引擎,增添了数据版本信息字段配置选项。在数据依据ORDER BY设置对数据进行排序的基础上,如果数据的版本信息列不在排序字段中,那么版本信息会被隐式的作为ORDER BY的最后一列从而影响数据排序。
-
GraphiteMergeTree : 用来存储时序数据库Graphites的数据。
Log Engines
Log系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景。
几种Log表引擎的共性是:
- 数据被顺序append写到磁盘上;
- 不支持delete、update;
- 不支持index;
- 不支持原子性写;
- insert会阻塞select操作。
-
TinyLog : 不支持并发读取数据文件,查询性能较差;格式简单,适合用来暂存中间数据;
-
Log : 支持并发读取数据文件,查询性能比TinyLog好;每个列会单独存储在一个独立文件中。
Integration Engines
该系统表引擎主要用于将外部数据导入到ClickHouse中,或者在ClickHouse中直接操作外部数据源。
- Kafka:将Kafka Topic中的数据直接导入到ClickHouse;
- MySQL:将Mysql作为存储引擎,直接在ClickHouse中对MySQL表进行select等操作;
- JDBC/ODBC:通过指定jdbc、odbc连接串读取数据源;
- HDFS:直接读取HDFS上的特定格式的数据文件;
Special Engines
-
Memory:将数据存储在内存中,重启后会导致数据丢失。查询性能极好,适合于对于数据持久性没有要求的1亿一下的小表。在ClickHouse中,通常用来做临时表。
-
Buffer:为目标表设置一个内存buffer,当buffer达到了一定条件之后会flush到磁盘。
-
File:直接将本地文件作为数据存储;
-
Null:写入数据被丢弃、读取数据为空;
-
Distributed : Distributed 引擎并不存储真实数据,而是来做分布式写入和查询,与其他引擎配合使用。比如:Distributed + MergeTree。并行执行查询操作。
-- 建表模板
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],
...
) 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, ...
-- ex
CREATE TABLE test (
id UInt16,
create_time Date,
title Nullable(String)
) ENGINE = MergeTree()
PARTITION BY create_time
ORDER BY (id, create_time)
PRIMARY KEY (id, create_time)
TTL create_time + INTERVAL 1 MONTH
SETTINGS index_granularity=8192;
-- 必填选项
# ENGINE:
引擎名字,MergeTree引擎无参数。
# ORDER BY:
排序键,可以由一列或多列组成,决定了数据以何种方式进行排序,例如ORDER BY(CounterID, EventDate)。如果没有显示指定PRIMARY KEY,那么将使用ORDER BY作为PRIMARY KEY。通常只指定ORDER BY即可。
-- 选填选项
# PARTITION BY:
分区键,指明表中的数据以何种规则进行分区。分区是在一个表中通过指定的规则划分而成的逻辑数据集。分区可以按任意标准进行,如按月、按日或按事件类型。为了减少需要操作的数据,每个分区都是分开存储的。
# PRIMARY KEY:
主键,设置后会按照主键生成一级索引(primary.idx),数据会依据索引的设置进行排序,从而加速查询性能。默认情况下,PRIMARY KEY与ORDER BY设置相同,所以通常情况下直接使用ORDER BY设置来替代主键设置。
# SAMPLE BY:
数据采样设置,如果显示配置了该选项,那么主键配置中也应该包括此配置。例如 ORDER BY CounterID / EventDate / intHash32(UserID)、SAMPLE BY intHash32(UserID)。
# TTL:
数据存活时间,可以为某一字段列或者一整张表设置TTL,设置中必须包含Date或DateTime字段类型。如果设置在列上,那么会删除字段中过期的数据。如果设置的是表级的TTL,那么会删除表中过期的数据。如果设置了两种类型,那么按先到期的为准。例如,TTL createtime + INTERVAL 1 DAY,即一天后过期。使用场景包括定期删除数据,或者定期将数据进行归档。
# index_granularity:
索引间隔粒度。MergeTree索引为稀疏索引,每index_granularity条数据产生一条索引。index_granularity默认设置为8092。
# enable_mixed_granularity_parts:
是否启动index_granularity_bytes来控制索引粒度大小。
# index_granularity_bytes:
索引粒度,以字节为单位,默认10Mb。
# merge_max_block_size:
数据块合并最大记录个数,默认8192。
# merge_with_ttl_timeout:
合并频率最小时间间隔,默认1天。