1、什么是ClickHouse
ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。
2、优势
查询速度超快,支持秒亿行的吞吐。
3、使用
3.1 数据类型
注意:ClickHouse 的数据类型严格区分大小写。
3.1.1 整型
固定长度的整型,包括有符号整型或无符号整型。
整型范围(-2^(n-1) ~ 2^(n-1)-1):
Int8、Int16、Int32、Int64、Int128、Int256
无符号整型范围(0~ 2^(n)-1):
UInt8、UInt16、UInt32、UInt64、UInt128、UInt256
3.1.2 浮点型
Float32 - float
Float64 - double
尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,例如货币数量或页面加载时间用毫秒为单位表示。因为浮点数进行计算可能引起四舍五入的误差。
与标准SQL相比,ClickHouse 支持以下类别的浮点数:
Inf - 正无穷
-Inf - 负无穷
NaN - 非数字
3.1.3 字符串
1)String
字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
2) FixedString(N)
固定长度 N 的字符串(N 必须是严格的正自然数)。
当向ClickHouse中插入数据时:
- 如果字符串包含的字节数少于N,将对字符串末尾进行空字节填充。
- 如果字符串包含的字节数大于N,将抛出 Too large value for FixedString(N) 异常。
当做数据查询时,ClickHouse不会删除字符串末尾的空字节。 如果使用WHERE子句,则须要手动添加空字节以匹配FixedString的值。
与String相比,极少会使用FixedString,因为使用起来不是很方便。
3.1.4 布尔值
从https://github.com/ClickHouse/ClickHouse/commit/4076ae77b46794e73594a9f400200088ed1e7a6e 之后,有单独的类型来存储布尔值。
在此之前的版本,没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。具体见枚举类型。
3.1.5 枚举类型
枚举包括 Enum8 和 Enum16 类型。Enum 保存 ‘String’=integer 的对应关系。
- Enum8 用 ‘String’=Int8 描述。
- Enum16 用 ‘String’=Int16 描述。
用法举例:
创建一个带有一个枚举 Enum8(‘hello’ = 1, ‘world’ = 2) 类型的列:
CREATE TABLE t_enum (
x Enum8('hello' = 1, 'world' = 2)
) ENGINE = TinyLog
这个 x 列只能存储类型定义中列出的值:‘hello’ 或 ‘world’。如果您尝试保存任何其他值,ClickHouse 抛出异常。
注意:键值对不能同时为空,不允许重复,key允许为空字符串。
3.1.6 数组
Array(T) : 由 T 类型元素组成的数组。
T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。例如,不能在 MergeTree 表引擎中存储多维数组。
创建数组:
array(T) 或 [] 类型必须相同
举例:
SELECT array(1, 2) AS x
SELECT [1, 2] AS x
ClickHouse会自动检测数组元素,并根据元素计算出存储这些元素最小的数据类型。如果在元素中存在 NULL 或存在 可为空 类型元素,那么数组的元素类型将会变成 可为空。
如果 ClickHouse 无法确定数据类型,它将产生异常。
3.1.6 元组
Tuple(T1, T2, …) :元组,其中每个元素都有单独的类型。
创建元组:
tuple(T1, T2, ...) 允许不同类型
举例:
SELECT tuple(1,'a') AS x
3.1.7 日期
日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。
Date、DateTime、DateTime64
- Date:精确到天。(2022-08-01)
- DateTime:精确到秒。(2022-08-01 19:19:19)
- DateTime64:精确到亚秒,可以设置精度。(2022-08-01 19:19:19.000)
3.2 表引擎
表引擎(即表的类型)决定了:
- 数据的存储方式和位置,写到哪里以及从哪里读取数据。
- 并发数据访问。
- 索引的使用(如果存在)。
- 是否可以执行多线程请求。
- 数据复制参数。
3.2.1 TinyLog
最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。
该引擎没有并发控制:
- 如果同时从表中读取和写入数据,则读取操作将抛出异常。
- 如果同时写入多个查询中的表,则数据将被破坏。
这种表引擎的典型用法是 write-once : 首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此引擎是适合的,因为它需要打开的文件更少。当拥有大量小表时,可能会导致性能低下。
不支持索引。
3.2.2 Memory
内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。读写操作不会相互阻塞,简单查询有非常高的查询性能(超过10G/s),因为没有磁盘读取,不需要解压缩或反序列化数据的过程。
不支持索引。
它可用于测试,适用于数据量又不太大(