什么是 ClickHouse?简单来说它是一个高性能,面向列的SQL数据库管理系统(DBMS),用于在线分析处理(OLAP)。
ClickHouse 提供了大量的数据引擎,分为数据库引擎、表引擎,根据数据特点及使用场景选择合适的引擎,这很重要。其相关文档为:
数据库引擎
数据表引擎
数据库引擎默认是 Ordinary,在这种数据库下的表可以是任意类型引擎。生产环境中常用的表引擎是 MergeTree 系列,也是官方主推的引擎。
表引擎在 ClickHouse 中的作用十分关键,直接决定了数据如何存储和读取、是否支持 index、支持的 query 种类、是否支持主备复制等。其表引擎比较多,各有各的用途,那应该如何选择呢?
表引擎概述
Log 系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景。
几种 Log 表引擎的共性是:
它们彼此之间的区别是:
主要用于将外部数据导入到 ClickHouse 中,或者在 ClickHouse 中直接操作外部数据源。
大多是为了特定的场景而定制。如:
官方主推存储引擎,支持几乎所有 ClickHouse 核心功能。适用于负载任务,可以快速插入数据(极大量的数据插入到一张表中)并进行后续的后台数据处理。
表结构,MergeTree 官方文档表结构:
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—引擎名和参数。ENGINE = MergeTree(). MergeTree 引擎没有参数
PARTITION BY—分区键
ORDER BY—表的排序键
PRIMARY KEY—主键【默认情况下主键跟排序键(由 ORDER BY
子句指定)相同】
SAMPLE BY—用于抽样的表达式
SETTINGS—影响 MergeTree 性能的额外参数:
index_granularity—索引粒度。即索引中相邻『标记』间的数据行数。默认值,8192。
index_granularity_bytes—索引粒度,以字节为单位,默认值: 10Mb。
enable_mixed_granularity_parts—启用或禁用通过index_granularity_bytes控制索引粒度的大小。
merge_with_ttl_timeout—TTL合并频率的最小间隔时间。默认值: 86400 (1天)。
write_final_mark—启用或禁用在数据片段尾部写入最终索引标记。默认值:1(不建议更改)。
storage_policy—存储策略。
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, ...]
合并的时候,ReplacingMergeTree 从所有具有相同主键的行中选择一行留下:
SummingMergeTree:
有汇总求和功能。当合并 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, ...]
AggregatingMergeTree:
有聚合功能。
CollapsingMergeTree:
有折叠删除功能。
VersionedCollapsingMergeTree:
有版本折叠功能。
GraphiteMergeTree:
有压缩汇总功能。
数据类型
UInt8
, UInt16
, UInt32
, UInt64
, UInt128
, UInt256
, Int8
, Int16
, Int32
, Int64
, Int128
, Int256
)。Float32
和 Float64
)和 Decimal
值。Boolean
类型。String
和 FixedString
。Date
和 Date32
表示天数,使用 DateTime
和 DateTime64
表示时间实例。JSON
对象将 JSON 文档存储在单个列中。UUID
值的高性能选项。Enum
,当列最多有 10,000 个唯一值时,请使用 LowCardinality
。Array
。Map
存储键/值对。SimpleAggregateFunction
和 AggregateFunction
存储聚合函数结果的中间状态。Nested
数据结构类似于单元格内的表。Tuple
,每个元素都有单独的类型。Nullable
允许您在值“缺失”时将值存储为 NULL
(而不是列获取其数据类型的默认值)。IPv4
和 IPv6
高效存储 IP 地址。Point
、 Ring
、 Polygon
和 MultiPolygon
。Expression
、 Set
、 Nothing
和 Interval
。时间日期函数