Clickhouse中的基本数据类型操作和引擎

使用:Clickhouse适合对少量的列进行聚合查询,不适合对大量的列进行明细查询

一、表操作

数据类型:

注意事项:

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中,并允许对表进行INSERTSELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换

MySQL数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中,因此可以执行诸如SHOW TABLESSHOW 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引擎

LogTinyLog 的不同之处在于,«标记» 的小文件与列文件存在一起。这些标记写在每个数据块上,并且包含偏移量,这些偏移量指示从哪里开始读取文件以便跳过指定的行数。

这使得可以在多个线程中读取表数据,对于并发数据访问,可以同时执行读取操作,而写入操作则阻塞读取和其它写入。Log引擎不支持索引,同样,如果写入表失败,则该表将被破坏,并且从该表读取将返回错误。

因此,Log引擎适用于临时数据,write-once 表以及测试或演示目的。

Log引擎表的文件结构:

(3)StripeLog引擎

写数据:

StripeLog 引擎将所有列存储在一个文件中。对每一次 Insert 请求,ClickHouse 将数据块追加在表文件的末尾,逐列写入。

ClickHouse 为每张表写入以下文件:

  • data.bin — 数据文件。

  • index.mrk — 带标记的文件。标记包含了已插入的每个数据块中每列的偏移量。

StripeLog 引擎不支持 ALTER UPDATEALTER 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

(上述举例和官网中示例中[ ] 中的内容属于可加,可不加的内容)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值