【ClickHouse】建表风波

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

在上一篇文章中,我们了解了ClickHouse的适用场景以及为什么那么快

在这篇文章中我们就可以开始上手操作了

安装

先来安装一个ClickHouse服务

这里我选择直接使用Docker的方式来部署

  • 拉取镜像
shell 复制代码
docker pull yandex/clickhouse-server
  • 运行容器
shell 复制代码
docker run -d -p 8123:8123 -p 9000:9000 --name clickhouse yandex/clickhouse-server

由于本系列只是带大家熟悉ClickHouse的基本概念与操作

所以直接使用最简单的方式来安装ClickHouse便于我们动手实践

不过不建议使用该方式部署正式环境

建表

之前说过ClickHouse是兼容标准SQL

那就用我们熟知的建表语句先创建一张表吧

数据类型

不过在建表之前,需要先了解ClickHouse中有哪些数据类型

平时在MySQL中用的比较多的数据类型也就是整型,字符串和时间

我们现在看看在ClickHouse中的整型,字符串和时间都叫什么

(实际上ClickHouse还有很多其他的基础类型和复合类型,如数组,元组,嵌套类型等,在这里就先不展开了)

  • 整型

ClickHouse中整型可以使用Int8Int16Int32Int64来表示

相比于MySQL中使用tinyintsmallintmediumintintbigint这种通过"小","中","大"来描述大小的定义

我倒是觉得直接用"8","16","32","64"来的更直观一点

  • 字符串

字符串直接用String即可

也不需要像MySQL中的varcher需要指定大小

不过也存在FixedString用于定长字符串

  • 时间

ClickHouse中也提供了和MySQLdatetime类似的DateTime类型来表示时间

建表DDL

在大概了解了ClickHouse的数据类型之后

如下就是我们的建表语句了

sql 复制代码
create table test
(
    id   Int64,
    name String,
    create_time DateTime
)

当我自信万分的执行了这句脚本之后

噔!只见一行红色的报错出现在了我的控制台

console 复制代码
Code: 62. DB::Exception: Syntax error: failed at position 80 (end of query) (line 6, col 2): . Expected one of: storage definition, ENGINE, AS. (SYNTAX_ERROR) (version 22.1.3.7 (official build))

可恶!没想到竟然开局失利

不过不用在意,这样的事情对我来说已经是家常便饭了

让我们 ChatGPT Google Baidu 看看这又是整什么幺蛾子

搜跌死捏,我已经完全明白了

ClickHouse在建表的时候需要指定表引擎,也就是ENGINE

大家可以理解为类似MySQL中的引擎

不同的表引擎会有不同的特性,适合不同的场景

表引擎

ClickHouse有非常多的表引擎可供我们选择

为了不让对表引擎不太熟悉的选择困难症们纠结到底使用哪一个

我们直接使用MergeTree这个最常用的系列

于是,我们的建表SQL就变成了这样

sql 复制代码
create table test
(
    id   Int64,
    name String,
    create_time DateTime
) ENGINE = MergeTree();

排序键和主键

你以为这样就能建表成功了吗?太天真了!

大家有没有发现我们的建表语句里面竟然没有指定主键

虽然MySQL可以不设置主键(因为会有一个全局的ID)

但是我们平时建表的时候肯定都会指定主键

有了主键索引就能更快的查询数据

所以对于ClickHouseMergeTree引擎来说

必须指定ORDER BY参数,也就是排序键

sql 复制代码
create table test
(
    id   Int64,
    name String,
    create_time DateTime
) ENGINE = MergeTree()
order by id;

这样就没有问题了

哎~为什么是排序键而不是主键呢?

其实是因为ClickHouse会默认使用指定的排序键作为主键

不过你也可以手动指定主键

java 复制代码
create table test
(
    id   Int64,
    name String,
    create_time DateTime
) ENGINE = MergeTree()
primary key id
order by (id, name);

这样就是使用id作为主键同时对数据进行先idname的排序了

不过需要注意的是手动指定的主键必须是排序键的开头的字段

比如下面这样是不行的

sql 复制代码
create table test
(
    id   Int64,
    name String,
    create_time DateTime
) ENGINE = MergeTree()
primary key name
order by (id, name);

先通过id排序在通过name排序,但是使用name作为主键就会提示异常

console 复制代码
Primary key must be a prefix of the sorting key, but the column in the position 0 is id, not name.

就是说排序键的第一个字段是id不是name,所以主键必须要从id开始

这个其实就和我们平时所说的索引的最左前缀匹配原则是一样的

插入数据

我们的表算是创建成功了

接下来就要开始插入数据了

浅浅尝试一条,万一和建表一样全是坑

sql 复制代码
insert into test(id, name, create_time) VALUES (1, '1', '2024-03-16');

Lucky!插入成功了

SELECT子句

除了这种常用的插入方式

ClickHouse还支持通过select子句来批量插入

我们现在有一张另外的表test_source

id first_name last_name
1 first1 last1
2 first2 last2
3 first3 last3

假设我们需要将test_source中的数据进行一些处理之后插入到test表中

其中id直接移过去,name需要用first_name+last_name,时间需要当前时间

我们可以这样来导入

sql 复制代码
insert into test(id, name, create_time) select id, concat(first_name, last_name) as name, now() from test_source;

炒鸡方便有木有

我们不需要用程序把数据查询出来计算完后再批量导入

而只需要一句SQL就可以完成所有操作

不过这里也需要注意

如果数据量过大的话可能会导致ClickHouse的内存达到上限(可以通过配置修改上限)

所以一般大数据量是通过分批导入的

更新删除数据

我们再来试试更新和删除操作

sql 复制代码
update test set name = 'name1' where id = 1

delete from test where id = 1;

和我们平时的更新和删除一样

执行也完全没有问题

西卡西!

不要觉得没问题就肆无忌惮的更新和删除哦

这两句SQL的本来面目其实是这样的

sql 复制代码
alter table test update name = 'name1' where id = 1;

alter table test delete where id = 1;

虽然我们可以成功的执行更新和删除

但是这种操作的成本是很高的

只是我们看着只是修改了一个字段而已

而且整个操作是异步的哦

也就是说更新和删除之后可能并不会马上生效

总结

ClickHouse在建表的时候需要指定引擎用于适配不同的业务场景

ClickHouse能够通过Select自查询来批量导入数据

ClickHouseMergeTree引擎要避免频繁的使用更新和删除操作

相关推荐
计算机学姐39 分钟前
基于python+django+vue的影视推荐系统
开发语言·vue.js·后端·python·mysql·django·intellij-idea
JustinNeil1 小时前
简化Java对象转换:高效实现大对象的Entity、VO、DTO互转与代码优化
后端
青灯文案11 小时前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
不睡懒觉的橙1 小时前
【医疗大数据】医疗保健领域的大数据管理:采用挑战和影响
大数据·人工智能·信息可视化·人机交互·健康医疗
数分大拿的Statham2 小时前
PostgreSQL中的regexp_split_to_table函数详解,拆分字段为多行
大数据·数据库·postgresql·数据分析·数据清洗
微尘82 小时前
C语言存储类型 auto,register,static,extern
服务器·c语言·开发语言·c++·后端
计算机学姐2 小时前
基于PHP的电脑线上销售系统
开发语言·vscode·后端·mysql·编辑器·php·phpstorm
howard20053 小时前
大数据时代:历史、发展与未来
大数据
翔云API3 小时前
人证合一接口:智能化身份认证的最佳选择
大数据·开发语言·node.js·ocr·php
码拉松3 小时前
千万不要错过,优惠券设计与思考初探
后端·面试·架构