暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ClickHouse的Engine

科技之新 2021-08-02
268

面对强大的clickHouse,试想一下这个产品是来自于伟大的战斗名族俄罗斯,这一切就不难想象这个软件的厉害之处了,介绍一下clickhouse里面的engine:

在engine家族里面讲engine分为四大部分:

(1)MergeTree

适合高负载将数据快速插入表的情形,支持数据复制,分区、分块等

  • MergeTree

适合场景:数据插入过程中多次重复写入数据存储

特点

大量的数据插入到表中,后台将会逐个part写入,并且按照后台的规则对写入的数据进行合并

使用主键存储数据,还会使用一些稀疏索引来帮助快速找到数据

按照分区字段进行分区操作

数据复制支持和数据抽样支持

# 创建表
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],
...
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'], ...]
[SETTINGS name=value, ...]

复制
  • ReplacingMergeTree

适合场景:清除重复数据,节省数据空间

特点:清除重复数据往往发生在数据合并时,所以在清除数据时,可以节省大量的空间,但是不能保证数据没有重复。

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

复制
  • SummingMergeTree

适合场景:适合汇总统计的场景

特点:与MergeTree一起使用,存储使用MergeTree,但是查询使用SummingMergeTree去聚合存储的数据,clickhouse会复制所有相同主键的列,并将包含有数字类型的列聚合起来形成新的列。

# 创建表
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, ...]

# 例子
CREATE TABLE summtt
(
key UInt32,
value UInt32
)
ENGINE = SummingMergeTree()
ORDER BY key

INSERT INTO summtt Values(1,1),(1,2),(2,1)

SELECT key, sum(value) FROM summtt GROUP BY key

┌─key─┬─sum(value)─┐
2 1
1 3
└─────┴──── ─┘

# 注意:当某个字段值为0时,此条数据将会被删除
[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)]
[(1, 100)] + [(1, 150)] -> [(1, 250)]
[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)]
[(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)]

复制
  • Aggregatingmergetree

适合场景:增量数据聚合

特点

可以结合AggregateFunction使用:

CREATE TABLE t
(
column1 AggregateFunction(uniq, UInt64),
column2 AggregateFunction(anyIf, String, UInt8),
column3 AggregateFunction(quantiles(0.5, 0.9), UInt64)
) ENGINE = ...

复制

可以结合SimpleAggregateFunction使用:

CREATE TABLE t
(
column1 SimpleAggregateFunction(sum, UInt64),
column2 SimpleAggregateFunction(any, String)
) ENGINE = ...

复制



  • CollapsingMergeTree

适用场景:适合记录银行流水的场景

特点:每一行记录后都有一个sign标记,这个标记用来指示此条记录是否有效,是否属于当前状态。

# 创建表
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, ...]

# 实例
CREATE TABLE UAct
(
UserID UInt64,
PageViews UInt8,
Duration UInt8,
Sign Int8
)
ENGINE = CollapsingMergeTree(Sign)
ORDER BY UserID

INSERT INTO UAct VALUES (4324182021466249494, 5, 146, 1)
INSERT INTO UAct VALUES (4324182021466249494, 5, 146, -1),(4324182021466249494, 6, 185, 1)
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
4324182021466249494 5 146 1
4324182021466249494 5 146 -1
4324182021466249494 6 185 1
└──────────────────┴──────┴── ────┴────┘
┌──────────────UserID─┬─PageViews─┬─Duration─┐
4324182021466249494 6 185
└──────────┴───────────┴──────────┘

复制


  • VersionedCollapsingMergeTree

功能跟CollapsingMergeTree 一样,只不过标记为增加了一个“version”,版本字段

  • GraphiteMergeTree

用来对稀疏数据进行聚合和平均操作


(2)Log

具有最小功能的轻型引擎。当您需要快速编写许多小表(最多约100万行)并在以后整体读取它们时,它们是最有效的。

  • TinyLog

适用场景:快速读写大量的小表,每个表不能超过100万行

特点:轻量级,write-once method(一次写入多次读取),用于处理小批量中间数据,比log engine更简单

  • Log

适用场景:临时数据表,用于测试或者演示等目的

特点:跟TinyLog相似,但也有区别:存储的列文件中存在某些“标记”数据,这些数据都是写到数据块上并携带些offset,这些offset可以记录从何处读取文件和跳转到何处去,在并发数据访问中适合多线程读取表数据,写操作是带锁的,log engine不支持索引操作,如果表写入失败,将会导致表不可用。

  • Stripelog

适用场景:使用少量数据(不超过100万条)写多张表

特点:列式存储,将所有列存储在一个文件中

# 创建表
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = StripeLog

# 写数据
# 所有的数据都存在下面两个文件中
data.bin Data file.
index.mrk File with marks. Marks contain offsets for each column of each data block inserted.

# 读数据
# 并行读取数据,不保证读数顺序,杂乱无序的

复制

(3)Integration Engines

  • Kafka

  • MySQL

  • ODBC

  • JDBC

  • HDFS

  • S3


(4)Special Engines

  • Distributed

  • MaterializedView

  • Dictionary

  • Merge

  • File

  • Null

  • Set

  • Join

  • URL

  • View

  • Memory

  • Buffer


文章转载自科技之新,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论