一、表操作
数据类型:
注意事项:
1、建表写数据类型的时候,严格区分大小写Int32,不能写成int32
2、建表的时候,必须要指定表引擎
1.整数类型
2. 字符串类型
String:可以任意长度的。它可以包含任意的字节集,包含空字节。因此,字符串类型可以代替其他 DBMSs 中的 VARCHAR、BLOB、CLOB 等类型。
FixedString(长度):固定长字符串,参数是字节数,执行效率比String要高
3.日期类型
(1)Date 年-月-日
(2)Date32 年-月-日
(3)DateTime 年-月-日 时-分-秒
(4)DateTime64 年-月-日 时-分-秒.毫秒
4.UUID类型
clickhouse提供了一个函数: generateUUIDv4()
生成一个00000000-0000-0000-0000-000000000000 的编号,此编号的类型就是UUID类型
5.Nullable类型
例如建表的时候,有一个id字段类型时Int32,如果当id不确定的时候,我们应该使用null进行填充,而不应该用默认值0,所以,我们这里应该添加的是null
(1)未使用该类型
(2)使用该类型
6.数组 Array(T)
字段类型是数组,对于同一个数组,在建表的时候指定数据类型
注意1:在MergeTree表引擎中是不允许出现数组嵌套的
注意2:可以使用array()函数或[ ]将元素组成数组,将来还可以使用toTypeName()查看某一列的数据类型
7.小数类型
举例:12.12234 Decimal(7,5)
P: 7
S: 5
建表语句与插入数据:
1.建表语句:
create table users3 (id Int8,name FixedString(12),gender Nullable(FixedString(3)),clazz String) ENGINE = TinyLog;
2.插入数据
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
举例:
insert into students_test values (1001,'小明','男','2班'),(1002,'小李','男','2班'),(1003,'小花','女','2班');
insert into students_test (name,gender,clazz) values ('小王','男','三班');
3.查看表结构:
desc 表名;
三、引擎
1、数据库引擎
数据库存放目录:
1.1 Atomic引擎
clickhouse数据库建库默认指定的数据库引擎
它支持非阻塞的DROP TABLE和RENAME TABLE查询和原子的EXCHANGE TABLES t1 AND t2查询。默认情况下使用Atomic数据库引擎。
1.2 MySQL引擎
MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许对表进行INSERT
和SELECT
查询,以方便您在ClickHouse与MySQL之间进行数据交换
MySQL
数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中,因此可以执行诸如SHOW TABLES
或SHOW CREATE TABLE
之类的操作。
但您无法对其执行以下操作:
-
RENAME
-
CREATE TABLE
-
ALTER
在clickhouse中创建数据库并指定远程的MySQL服务,将其中的某一个数据库映射过来(就将这新建的数据库看成一个远程客户端连接了mysql)
总结:在clickhouse数据库操作mysql的时候,可以进行查询和添加操作,不能进行删除和修改操作
图释:
建库语句
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
举例
create database IF NOT EXISTS bigdata24_mysql ENGINE = MySQL('192.168.169.100:3306','bigdata24','root','123456');
参数理解:
host:port — MySQL服务地址,既可以是ip地址,也可以是主机名(如果是主机名,要配置hosts映射)
database — MySQL数据库名称
user — MySQL用户名
password — MySQL用户密码
2、表引擎
2.1 日志引擎
(1)TinyLog 引擎
最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中。写入时,数据将附加到文件末尾。
并发数据访问不受任何限制:
如果同时从表中读取并在不同的查询中写入,则读取操作将抛出异常
如果同时写入多个查询中的表,则数据将被破坏。
这种表引擎的典型用法是 write-once:首先只写入一次数据,然后根据需要多次读取。查询在单个流中执行。换句话说,此引擎适用于相对较小的表(建议最多1,000,000行)。如果您有许多小表,则使用此表引擎是适合的,因为它比Log引擎更简单(需要打开的文件更少)。当您拥有大量小表时,可能会导致性能低下,但在可能已经在其它 DBMS 时使用过,则您可能会发现切换使用 TinyLog 类型的表更容易。不支持索引。
数据库目录位置:/var/lib/clickhouse/data
TinyLog 引擎表的文件结构:
(2) Log引擎
Log
与TinyLog
的不同之处在于,«标记» 的小文件与列文件存在一起。这些标记写在每个数据块上,并且包含偏移量,这些偏移量指示从哪里开始读取文件以便跳过指定的行数。这使得可以在多个线程中读取表数据,对于并发数据访问,可以同时执行读取操作,而写入操作则阻塞读取和其它写入。
Log
引擎不支持索引,同样,如果写入表失败,则该表将被破坏,并且从该表读取将返回错误。
因此,Log
引擎适用于临时数据,write-once 表以及测试或演示目的。
Log引擎表的文件结构:
(3)StripeLog引擎
写数据:
StripeLog
引擎将所有列存储在一个文件中。对每一次Insert
请求,ClickHouse 将数据块追加在表文件的末尾,逐列写入。ClickHouse 为每张表写入以下文件:
data.bin
— 数据文件。
index.mrk
— 带标记的文件。标记包含了已插入的每个数据块中每列的偏移量。
StripeLog
引擎不支持ALTER UPDATE
和ALTER DELETE
操作。读取数据:
带标记的文件使得 ClickHouse 可以并行的读取数据。这意味着
SELECT
请求返回行的顺序是不可预测的。使用ORDER BY
子句对行进行排序。
StripeLog引擎表的文件结构:
2.2 合并树家族
(1)MergeTree引擎
Clickhouse 中最强大的表引擎当属
MergeTree
(合并树)引擎及该系列(*MergeTree
)中的其他引擎。
MergeTree
系列的引擎被设计用于插入极大量的数据到一张表当中。数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合并。相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多。主要特点:
存储的数据按主键排序。
这使得可以创建一个小型的稀疏索引来加快数据检索。
如果指定了分区键的话,可以使用分区。
在相同数据集和相同结果集的情况下 ClickHouse 中某些带分区的操作会比普通操作更快。查询中指定了分区键时 ClickHouse 会自动截取分区数据。这也有效增加了查询性能。
支持数据副本。
ReplicatedMergeTree
系列的表提供了数据副本功能。支持数据采样。
需要的话,可以给表设置一个采样方法。
MergeTree引擎表的文件结构:
注意:默认是针对每一批数据按照分区字段的值进行分区
此时再次向此表中添加元素
再次观察表的文件结构:
发现此时多出了两个分区文件,说明添加后并不会立刻的将所有的相同的分区进行合并 :
(1)如果不去管它们,过一段时间后会自动合并
(2)如果想要很快的看到结果,可以使用下面的命令手动的进行合并
optimize table 表名 final;
更多更具体的可以在官方网址学习:ClickHouse Docs | ClickHouse Docs
(上述举例和官网中示例中[ ] 中的内容属于可加,可不加的内容)