前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ClickHouse *MergeTree表引擎

ClickHouse *MergeTree表引擎

作者头像
MySQL轻松学
发布2019-09-20 17:05:45
5.4K0
发布2019-09-20 17:05:45
举报
文章被收录于专栏:MYSQL轻松学MYSQL轻松学

Clickhouse 中最强大的表引擎当属 MergeTree引擎及*MergeTree中的其他分支引擎。

MergeTree

数据是由多组part文件组成,每一个part的数据是按照主键进行字典序排列。这些数据片段在后台按照一定规则合并。

代码语言:javascript
复制
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
    INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
    INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
  • ENGINE:表的引擎类型,MergeTree要求有一个日期字段,还有主键
  • PARTITION BY — 分区键
  • ORDER BY — 排序键
  • PRIMARY KEY — 主键,默认情况下主键跟排序键(由 ORDER BY 子句指定)相同
  • SAMPLE BY — 用于抽样的表达式,如果要用抽样表达式,主键中必须包含这个表达式。
  • SETTINGS — 影响 MergeTree 性能的额外参数 index_granularity — 索引粒度 use_minimalistic_part_header_in_zookeeper — 数据片段头在 ZooKeeper 中的存储方式 min_merge_bytes_to_use_direct_io — 使用直接 I/O 来操作磁盘的合并操作时要求的最小数据量,默认10G。

ReplacingMergeTree

该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。但数据的去重只会在merge的过程中出现,merge操作是后台进程异步执行。 OPTIMIZE TABLE 操作可以手动触发merge操作,但会引发对大量数据的读和写操作,降低性能。因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,并不保证没有重复的数据出现。

代码语言:javascript
复制
 CREATE TABLE default.t1 (
 `gmt` Date, `id` UInt16, 
 `name` String, 
 `ver` UInt16
 ) ENGINE = ReplacingMergeTree(gmt, name, 8192, ver)

合并的时候,ReplacingMergeTree 从所有具有相同主键的行中选择一行留下:

  • 如果 ver 列未指定,选择最后一条。
  • 如果 ver 列已指定,选择 ver 值最大的版本。

SummingMergeTree

当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行进行汇总,将同一主键的行替换为包含sum后的一行记录。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。

代码语言:javascript
复制
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...
  • 如果没有指定 [columns],ClickHouse 会把除主键外的其他列都进行汇总。
  • 如果用于汇总的所有列中的值均为0,则该行会被删除。
  • 按片段合并数据,会出现不同数据片段中包含具有相同主键的行。

AggregatingMergeTree

ClickHouse会将相同主键的行(在一个数据片段内)替换为单个存储一系列聚合函数状态的行。可以使用 AggregatingMergeTree 表来做增量数据统计聚合,包括物化视图的数据聚合。

代码语言:javascript
复制
create table visits(gmt Date, D1 String, D2 String, D3 String, M1 UInt16) ENGINE=MergeTree(gmt, (gmt, D1, D2, D3), 8192)

CREATE MATERIALIZED VIEW basic
ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMM(StartDate) ORDER BY (CounterID, StartDate)
AS SELECT
    CounterID,
    StartDate,
    sumState(Sign)    AS Visits,
    uniqState(UserID) AS Users
FROM visits
GROUP BY CounterID, StartDate;
  • AggregatingMergeTree 是在 MergeTree 基础之上,针对聚合函数结果,作增量计算优化的一个设计。
  • 不能使用普通的 INSERT 去添加数据,一是可以用 INSERT SELECT 来插入数据,二是可以创建一个物化视图,通过物化视图导入数据。

CollapsingMergeTree

在创建时与 MergeTree 基本一样,除了最后多了一个参数,需要指定 Sign 位(必须是 Int8 类型)。CollapsingMergeTree 会异步的删除(折叠)除了特定列 Sign 1 和 -1 值以外的所有字段的值重复的行。

代码语言:javascript
复制
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = CollapsingMergeTree(sign)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
  • sign — 类型列的名称:1 是“状态”行,-1 是“取消”行。

VersionedCollapsingMergeTree

是collapsingmergetree的升级,使用不同的collapsing算法,该算法允许使用多个线程以任何顺序插入数据。

代码语言:javascript
复制
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = VersionedCollapsingMergeTree(sign, version)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
  • sign — 类型列的名称:1 是“状态”行,-1 是“取消”行。
  • version — 包含对象版本的列,*uint类型。

Replicated*MergeTree

只有 Replicated*MergeTree 系列里的表可支持副本:

ReplicatedMergeTree

ReplicatedSummingMergeTree

ReplicatedReplacingMergeTree

ReplicatedAggregatingMergeTree

ReplicatedCollapsingMergeTree

ReplicatedVersionedCollapsingMergeTree

ReplicatedGraphiteMergeTree

代码语言:javascript
复制
CREATE TABLE table_name
(
    EventDate DateTime,
    CounterID UInt32,
    UserID UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/table_name', '{replica}')
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID)
  • INSERT 和 ALTER 操作副本间会复制。
  • CREATE,DROP,ATTACH,DETACH 和 RENAME 语句只会在单个服务器上执行,不会被复制。
  • 复制表需要借助Zookeeper。
  • 相比非复制表,写 zk 会导致 INSERT 的延迟略长一些,建议不要每秒一个INSERT,尽量批量写入。
  • 复制是多主异步。
  • 默认INSERT 语句仅等待一个副本写入成功后返回,insert_quorum参数可以指定几个副本写入成功后返回,默认为0。
  • 数据块会自动去重。

GraphiteMergeTree

应用于Graphite data的数据汇总,该引擎减少了存储容量,提高了Graphite查询的效率。

代码语言:javascript
复制
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    Path String,
    Time DateTime,
    Value <Numeric_type>,
    Version <Numeric_type>
    ...
) ENGINE = GraphiteMergeTree(config_section)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
  • config_section — 配置文件中名称,如下graphite_rollup_example
代码语言:javascript
复制
<!-- Example of parameters for GraphiteMergeTree table engine -->
<graphite_rollup_example>
    <pattern>
        <regexp>click_cost</regexp>
        <function>any</function>
        <retention>
            <age>0</age>
            <precision>3600</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <default>
        <function>max</function>
        <retention>
            <age>0</age>
            <precision>60</precision>
        </retention>
        <retention>
            <age>3600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>3600</precision>
        </retention>
    </default>
</graphite_rollup_example>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MYSQL轻松学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档