1.什么是 ClickHouse ?
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
也是是一个数据分析的数据库,列式存储数据。
2.ClickHouse 与其他数据库 性能对比
3. ClickHouse的特性
- 完备的DBMS功能
- 列式存储与数据压缩
- 向量化执行引擎
- 关系模型与SQL查询
- 磁盘存储的数据
- 数据复制和对数据完整性的支持
- 实时数据更新
4.ClickHouse 支持的数据类型
1.整型
有符号整型:Int8, Int16, Int32, Int64
无符号整型:UInt8, UInt16, UInt32, UInt64
2.浮点数
浮点数(Float32, Float64)
建议尽可能以整数形式存储数据。
对浮点数进行计算可能引起四舍五入的误差。
浮点计算结果可能是诸如正无穷大(inf)、负无穷大(-inf)和"非数字"(nan)。
3.有符号的浮点数
有符号的定点数(Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S))
4.变长字符串(String)
字符串可以任意长度的。它可以包含任意的字节,包含空字节。
5.定长字符串(FixedString(N))
固定长度 N 的字符串。N 必须是严格的正自然数。 当服务端读取长度小于 N 的字符串时候(例如解析 INSERT 数据时),通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。 当服务器写入一个字符串(例如,当输出 SELECT 查询的结果)时,NULL字节不会从字符串的末尾被移除,而是被输出。
6.布尔值
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。
7.通用唯一标识符(UUID)
通用唯一标识符(UUID)是用于标识记录的16字节数字。
如果在插入新记录时未指定UUID列值,则UUID值将填充为零:00000000-0000-0000-0000-000000000000
要生成UUID值,ClickHouse提供generateUUIDv4()函数。
UUID数据类型不支持算术运算(例如,abs)或聚合函数(例如sum和avg)。
UUID数据类型仅支持String数据类型也支持的函数(例如,min,max和count)
8.日期(Date)
日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。
最小值输出为0000-00-00。
9.时间戳(DateTime)
时间戳类型。用四个字节(无符号的)存储 Unix 时间戳)。允许存储与日期类型相同的范围内的值。最小值为 0000-00-00 00:00:00。时间戳类型值精确到秒。
DateTime、DateTime64 和 Date
Date: 2020-02-02 精确到天
DateTime: 2020-02-02 20:20:20 精确到秒
DateTime64: 2020-02-02 20:20:20.335 精确到亚秒,可以设置精度
均支持字符串写入
clickhouse 的时间类型没有时间戳类型, 最高精度是 秒 所以如果需要处理毫秒、微秒精度的时间,则只能借助UInt类型实现。
10.枚举类型(Enum8, Enum16)
Enum 保存 ‘string’= integer 的对应关系。在 ClickHouse 中,尽管用户使用的是字符串常量,但所有含有 Enum 数据类型的操作都是按照包含整数的值来执行。这在性能方面比使用 String 数据类型更有效。
Enum8 用 ‘String’= Int8 对描述。
Enum16 用 ‘String’= Int16 对描述。
CREATE TABLE t_enum
(
x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog
#
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
这个 x 列只能存储类型定义中列出的值:‘hello’或’world’。如果您尝试保存任何其他值,ClickHouse 抛出异常。
- 数组(Array(T))
由 T 类型元素组成的数组。
T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。
可以使用array()函数和中括号来创建数组
SELECT array(1, 2)
SELECT [1, 2]
如果在元素中存在 NULL或存在 Nullable类型元素,那么数组的元素类型将会变成 Nullable。
如果 ClickHouse 无法确定数据类型,它将产生异常。
- 元组(Tuple(T1, T2, …))
元组,其中每个元素都有单独的类型。
SELECT tuple(1,'a')
- 缺失值(Nullable(TypeName))
允许用特殊标记NULL表示"缺失值",可以与 TypeName 的正常值存放一起。例如,Nullable(Int8) 类型的列可以存储 Int8 类型值,而没有值的行将存储 NULL。
对于 TypeName,不能使用复合数据类型 Array和 Tuple。复合数据类型可以包含 Nullable 类型值,例如Array(Nullable(Int8))。
Nullable 类型字段不能包含在表索引中。
除非在 ClickHouse 服务器配置中另有说明,否则 NULL 是任何 Nullable 类型的默认值。
使用 Nullable 几乎总是对性能产生负面影响。
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
#
INSERT INTO t_null VALUES (1, NULL)
- 嵌套(Nested(Name1 Type1, Name2 Type2, …))
嵌套数据结构类似于嵌套表。嵌套数据结构的参数(列名和类型)与 CREATE 查询类似。每个表可以包含任意多行嵌套数据结构。
只支持一级嵌套。嵌套结构的列中,若列的类型是数组类型,那么该列其实和多维数组是相同的,所以目前嵌套层级的支持很局限(MergeTree 引擎中不支持存储这样的列)
大多数情况下,处理嵌套数据结构时,会指定一个单独的列。为了这样实现,列的名称会与点号连接起来。这些列构成了一组匹配类型。在同一条嵌套数据中,所有的列都具有相同的长度。
不能对整个嵌套数据结构执行 SELECT。只能明确列出属于它一部分列。
CREATE TABLE test.visits
(
CounterID UInt32,
StartDate Date,
Sign Int8,
IsNew UInt8,
VisitID UInt64,
UserID UInt64,
...
Goals Nested
(
ID UInt32,
Serial UInt32,
EventTime DateTime,
Price Int64,
OrderID String,
CurrencyID UInt32
),
...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
- Nothing
此数据类型的唯一目的是表示不是期望值的情况。 所以不能创建一个 Nothing 类型的值。
例如,文本 NULL 的类型为 Nullable(Nothing)。
3.clickhouse 与mysql 数据类型对比
参考: https://clickhouse.tech/docs/zh/engines/database-engines/mysql/