Clickhouse_4_数据定义

本文详细介绍了ClickHouse数据库的基础特性,包括数据类型、支持的数据库引擎、默认值设置、临时表与分区表的管理,以及视图(普通视图与物化视图)的应用。重点讲解了分区表的创建、查询、删除和复制,以及数据删除和修改的Mutation操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

一、数据类型

同MySQL,大同小异

二、数据库

数据库目前支持5种引擎:

  1. Ordinary:普通引擎,默认引擎
  2. 绝大多数情况,都会使用默认引擎,使用时无需刻意声明
  3. 在此数据库下可以使用任意类型表引擎
  4. Dictionary:字典引擎
  5. 会自动为所有数据字典创建它们的数据表
  6. Memory:内存引擎
  7. 一般用于存放临时数据
  8. 不会涉及任何磁盘操作,当服务重启后,数据会被清除
  9. Lazy:日志引擎
    1. 只能使用Log系列的引擎
    5. MySQL: MySQL引擎

三、默认值

表字段只支持三种默认值表达式的定义方式

  1. Default
  2. Materialized
  3. Alias
类型支持显示赋值select * 返回结果支持持久化
defaule
materialized××
alias×××

四、临时表

相比普通表而言,临时表有如下两个特殊之处:

  1. 生命周期与会话绑定,支持Memory引擎,会话结束,数据表会销毁
  2. 临时表,不属于任何数据,所以在创建语句中,既没有数据库参数也没有表引擎参数
create temporary table table_name ()

临时表的优先级大于普通表,当两张表的表明相同时,优先读取临时表数据,所以,通常情况,无需特意使用临时表,临时表大多应用于Clickhouse的内部;

五、分区表

数据分区(partition)
数据分区是针对本地数据而言,是数据的一种纵向切分;
在查询过程中,可以跳过不必要的数据目录,从而提升查询性能


数据分片(shard)
数据分片是对数据的一种横向切分;

5.1 创建分区

create table partition_v1 (ID String,URL String,EventTime Date) Engine=MergeTree() partition by toYYYYMM(EventTime) order by ID

create table partition_v1 (ID String,URL String,EventTime Date) Engine=MergeTree()
partition by toYYYYMM(EventTime) order by ID


partiton by 指定分区键


分区键不应该使用粒度过细的数据字段

在这里插入图片描述

iZwz9cs3943soqusmlnb7tZ :) select table,partition,path from system.parts where table='partition_v1'

SELECT 
    table, 
    partition, 
    path
FROM system.parts
WHERE table = 'partition_v1'

┌─table────────┬─partition─┬─path────────────────────────────────────────────────────────┐
│ partition_v1 │ 202107/var/lib/clickhouse/data/default/partition_v1/202107_1_1_0/ │
└──────────────┴───────────┴─────────────────────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.002 sec.

5.2 查询分区

Clikchouse内置了许多system系统表,用于查询自身的状态信息,其中parts系统表专门用于查询数据表的分区信息;system.parts

在这里插入图片描述

iZwz9cs3943soqusmlnb7tZ :) select partition_id,name,table,database from system.parts where table='partition_v1'

SELECT 
    partition_id, 
    name, 
    table, 
    database
FROM system.parts
WHERE table = 'partition_v1'

┌─partition_id─┬─name─────────┬─table────────┬─database─┐
│ 202107202107_1_1_0 │ partition_v1 │ default  │
└──────────────┴──────────────┴──────────────┴──────────┘

1 rows in set. Elapsed: 0.003 sec. 

iZwz9cs3943soqusmlnb7tZ :) 

5.3 删除分区

alter table partition_v1 drop partition 202107

在这里插入图片描述
在这里插入图片描述

5.4 复制分区

Clickhouse支持将A表的分区数据快速复制到B表,该特性主要用于快速数据写入、多表间数据同步和备份的场景;

ALTER TABLE B REPLACE PARTITION partition_v1 FROM A

并不是任意数据表之间都能够相互复制,需要满足以下条件

  1. 两张表需要相同的分区键
  2. 表结构需要完全相同

5.5 重置分区

# 重置 partition_v1 表内的 201908 分区 URL 字段数据
ALTER TABLE partition_v1 CLEAR COLUMN URL in PARTITION 201908

5.6 卸载分区

表分区可以通过 detach 语句卸载,分区被卸载后,物理数据并没有被删除,而是被转移到了当前数据目录表的 detached 子目录中;

一旦分区,被移动到了 detached 子目录,代表已经脱离了clickhouse的管理,Clickhouse并不会主动清理文件,这些分区文件会一直存在,除非我们主动删除或者 attach 语句重新装载;

ALTER TABLE tb_name DETACH PARTITION partition_expr
ALTER TABLE tb_name ATTACH PARTITION partition_expr

在这里插入图片描述

iZwz9cs3943soqusmlnb7tZ :) alter table partition_v1 detach partition 202107

ALTER TABLE partition_v1
    DETACH PARTITION 202107


Ok.

0 rows in set. Elapsed: 0.002 sec. 

iZwz9cs3943soqusmlnb7tZ :) 

在这里插入图片描述

六、视图

ClickHouse支持两种视图

  1. 普通视图
  2. 简单的查询代理
  3. 不会存储任何数据,只是单纯的 select 查询映射,只能简化查询,明晰语义,对查询性能不会有任何提升

物化视图

  1. 支持表引擎,数据保存形式由它的表引擎决定
  2. populate
  3. 如果使用populate修饰,会将源数据表的数据全部导入
  4. 物化视图不支持同步删除,如果在源数据表中删除了数据,物化视图仍会保留
  5. 物化视图如果创建好,当源数据表被写入数据,物化视图也会同步更新
  6. 物化视图本身是一张特殊的表,使用 .inner 特殊前缀的数据表
create marterialized view db.table_name engine=engine_name populate as select ...

七、分布式DDL

如果在集群中任意一个节点上执行DDL,那么集群中的每一个节点都会以相同的顺序执行相同的语句

CREATE TABLE partition_v3 ON CLUSTER ch_cluster( 
    ID String,
    URL String,
    EventTime Date
) ENGINE =  MergeTree()
PARTITION BY toYYYYMM(EventTime)
ORDER BY ID

八、数据删除/修改

Clickhouse提供了Update、Delete的能力,这类操作被称为“Mutation”查询;
1. Mutation 是一种很重的操作
2. Mutation 语句,是一个异步后台执行过程
3. 具体执行进度,需要通过 system.mutations 系统表查询

iZwz9cs3943soqusmlnb7tZ :) select * from partition_v1

SELECT *
FROM partition_v1

┌─ID───┬─URL───────────┬──EventTime─┐
│ A002 │ www.baidu.com │ 2021-07-01 │
└──────┴───────────────┴────────────┘

1 rows in set. Elapsed: 0.002 sec. 

iZwz9cs3943soqusmlnb7tZ :) alter table partition_v1 delete where ID='A002'

ALTER TABLE partition_v1
    DELETE WHERE ID = 'A002'


Ok.

0 rows in set. Elapsed: 0.013 sec. 

iZwz9cs3943soqusmlnb7tZ :) 

在这里插入图片描述

可以发现,执行了delete操作之后,每一个原有的数据目录都额外增加了一个同名目录,并且在末尾增加了 _4 的后缀;

在这里插入图片描述

mutation_4.txt 是一个日志文件,完整地记录了这次delete操作的执行语句和时间;

在这里插入图片描述

mutation_4.txt 是一个日志文件,完整地记录了这次delete操作的执行语句和时间;

在这里插入图片描述

 select database,table,mutation_id,block_numbers.number as number,is_done from system.mutations

为什么是以"_4"生成文件?


每执行一条 alter delete 语句,都会在 mutations 系统表中生成一条对应的执行计划,当 is_done=1 时表示执行完毕;


同时,在数据的根目录下,会以 mutation_id 为名生成对应的日志文件用于记录相关信息

在这里插入图片描述

旧的数据目录并不会立即被删除,而是会被标记成非激活状态(active=0)


等到MergeTree引擎下一次合并动作触发时,这些非激活目录才会被真正从物理意义上删除;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'嗯哼。

生生不息,“折腾”不止,Thx

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值