七十六ClickHouse的表引擎以及SQL语法

Posted 象在舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七十六ClickHouse的表引擎以及SQL语法相关的知识,希望对你有一定的参考价值。

上一篇文章我们介绍了一下ClickHouse的安装,这一篇我们主要来看一下它的表引擎已经SQL语法。关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~


目录

一、ClickHouse的数据类型

二、ClickHouse的表引擎

2.1 TinyLog

2.2 Memory

2.3 Merge

2.4 MergeTree

2.5 ReplacingMergeTree

2.6 SummingMergeTree

2.7 Distributed

三、ClickHouse的SQL语法

3.1 CREATE

3.2  INSERT INTO

3.3 ALTER

3.4 查看表结构

3.5 CHECK TABLE


一、ClickHouse的数据类型

在介绍表引擎和SQL语法之前,我们先来看一下它的数据类型。常用的数据类型如下所示:

1、整型。固定长度的整型,包括有符号整型(-2n-1~2n-1-1)和无符号整型(0~2n-1)。

2、浮点型。建议尽可能以整数形式存储数据。例如,将固定精度的数字转换为整数值,如时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。与标准SQL相比,ClickHouse 支持以下类别的浮点数:Inf-正无穷、-Inf-负无穷、NaN-非数字。

3、布尔类型。没有单独的类型来存储布尔值。可以使用UInt8类型,取值限制为0或1。

4、字符串。(1)String:字符串可以任意长度的。它可以包含任意的字节集,包含空字节。(2)FixedString(N):固定长度N的字符串,N必须是严格的正自然数。当服务端读取长度小于N的字符串时候,通过在字符串末尾添加空字节来达到N字节长度。当服务端读取长度大于N的字符串时候,将返回错误消息。与String相比,极少会使用FixedString,因为使用起来不是很方便。

5、枚举类型。包括Enum8和Enum16类型,Enum保存'string'=integer的对应关系,Enum8用'String'=Int8对描述,Enum16用'String'=Int16对描述。

6、数组。Array(T):由T类型元素组成的数组。T可以是任意类型,包含数组类型。但不推荐使用多维数组,ClickHouse对多维数组的支持有限。

7、元组。Tuple(T1, T2, ...):元组,其中每个元素都有单独的类型。

8、Date类型。日期类型,用两个字节存储,表示从1970-01-01 (无符号) 到当前的日期值。

此处仅列举出8中数据类型,更多数据类型可以参考官方文档

二、ClickHouse的表引擎

表引擎(即表的类型)决定了:1、数据的存储方式和位置,写到哪里以及从哪里读取数据。2、支持哪些查询以及如何支持。3、并发数据访问。4、索引的使用(如果存在)。5、是否可以执行多线程请求。6、数据复制参数。

ClickHouse的表引擎有很多,下面只介绍其中几种,对其他引擎有兴趣的可以去查阅官方文档

2.1 TinyLog

最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。该引擎没有并发控制,如果同时从表中读取和写入数据,则读取操作将抛出异常;如果同时写入多个查询中的表,则数据将被破坏。这种表引擎的典型用法是write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此表引擎是适合的,因为它比需要打开的文件更少。当拥有大量小表时,可能会导致性能低下。同时,它不支持索引。

下面我们来看一个简单的案例:创建一个TinyLog的表并插入数据。

我们可以到保存数据的目录下进行查看:

id.bin和name.bin是压缩过的对应的列的数据,sizes.json中记录了每个*.bin文件的大小:

2.2 Memory

内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。读写操作不会相互阻塞,不支持索引。简单查询下有非常非常高的性能表现(超过10G/s)。

一般用到它的地方不多,除了用来测试,就是在需要非常高的性能,同时数据量又不太大(上限大概1亿行)的场景。

2.3 Merge

Merge引擎(不要跟MergeTree引擎混淆)本身不存储数据,但可用于同时从任意多个其他的表中读取数据。读是自动并行的,不支持写入。读取时,那些被真正读取到数据的表的索引(如果有的话)会被使用。 

Merge引擎的参数:一个数据库名和一个用于匹配表名的正则表达式。

下面我们来看一个简单的案例:我们先建三个表,然后使用Merge引擎将其连接起来。

1、首先穿件三张表并插入数据

create table t1 (id UInt16, name String) ENGINE=TinyLog;
create table t2 (id UInt16, name String) ENGINE=TinyLog;
create table t3 (id UInt16, name String) ENGINE=TinyLog;

insert into t1(id, name) values (1, 't1');
insert into t2(id, name) values (2, 't2');
insert into t3(id, name) values (3, 't3');

2、创建Merge引擎表并查询

2.4 MergeTree

ClickHouse中最强大的表引擎当属MergeTree(合并树)引擎及该系列(*MergeTree)中的其他引擎。MergeTree引擎系列的基本理念如下。当你有巨量数据要插入到表中,你要高效地一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并。相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。其语法格式如下:

ENGINE [=] MergeTree(date-column [, sampling_expression], (primary, key), index_granularity)

参数释义:

1、date-column:类型为Date的列名。ClickHouse会自动依据这个列按月创建分区,分区名格式为 "YYYYMM"。

2、sampling_expression:采样表达式。

3、(primary, key):主键,类型为Tuple()。

4、index_granularity:索引粒度,即索引中相邻”标记”间的数据行数。设为8192可以适用大部分场景。

我们通过一个简单的案例来看一下:

1、首先新建people表并向表中插入几条数据,如下:

create table people (date  Date, id UInt8, name String) ENGINE=MergeTree(date, (id, name), 8192);

insert into people values ('2021-05-01', 1, 'xzw');
insert into people values ('2021-06-01', 2, 'fq');
insert into people values ('2021-05-03', 3, 'yxy');

2、我们在对应的数据目录下可以看到如下内容:

其中,*.bin是按列保存数据的文件,*.mrk保存块偏移量,primary.idx保存主键索引。

2.5 ReplacingMergeTree

这个引擎是在MergeTree的基础上,添加了“处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。有一些数据可能仍未被处理。因此,ReplacingMergeTree适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。其语法格式如下:

ENGINE [=] ReplacingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [ver])

可以看出他比MergeTree只多了一个ver,这个ver指代版本列,他和时间一起配置,区分哪条数据是最新的。

2.6 SummingMergeTree

该引擎继承自MergeTree。区别在于:当合并SummingMergeTree表的数据片段时,ClickHouse会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值。其语法格式如下:

ENGINE [=] SummingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns])

其中,columns是指包含将要被汇总的列的列名的元组。

2.7 Distributed

分布式引擎,本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。其语法格式如下:

Distributed(cluster_name, database, table [, sharding_key])

其中,cluster_name是指服务器配置文件中的集群名,在/etc/metrika.xml中配置的。sharding_key是指数据分片键。

三、ClickHouse的SQL语法

3.1 CREATE

1、CREATE DATABASE

CREATE DATABASE [IF NOT EXISTS] db_name

2、CREATE TABLE

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = engine

3.2  INSERT INTO

INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

3.3 ALTER

ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本语法如下所示:

ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...

3.4 查看表结构

DESCRIBE TABLE

3.5 CHECK TABLE

检查表中的数据是否损坏,他会返回两种结果:0表示数据已损坏;1表示数据完整。该命令只支持Log、TinyLog和StripeLog引擎。

 

以上就是本文的所有内容,比较简单。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题~

以上是关于七十六ClickHouse的表引擎以及SQL语法的主要内容,如果未能解决你的问题,请参考以下文章

大数据ClickHouse(十六):ClickHouse SQL语法之DML 操作

客快物流大数据项目(九十六):ClickHouse的VersionedCollapsingMergeTree深入了解

篇二啥是ClickHouse的表引擎?

客快物流大数据项目(九十七):ClickHouse的SQL语法

ClickHouse的介绍(基本sql操作,以及数据库引擎表引擎分片副本explain优化物化视图等)

七十五ClickHouse的简介与安装