一、数据类型
同MySQL,大同小异
二、数据库
数据库目前支持5种引擎:
- Ordinary:普通引擎,默认引擎
- 绝大多数情况,都会使用默认引擎,使用时无需刻意声明
- 在此数据库下可以使用任意类型表引擎
- Dictionary:字典引擎
- 会自动为所有数据字典创建它们的数据表
- Memory:内存引擎
- 一般用于存放临时数据
- 不会涉及任何磁盘操作,当服务重启后,数据会被清除
- Lazy:日志引擎
1. 只能使用Log系列的引擎
5. MySQL: MySQL引擎
三、默认值
表字段只支持三种默认值表达式的定义方式
- Default
- Materialized
- Alias
类型 | 支持显示赋值 | select * 返回结果 | 支持持久化 |
---|---|---|---|
defaule | √ | √ | √ |
materialized | × | × | √ |
alias | × | × | × |
四、临时表
相比普通表而言,临时表有如下两个特殊之处:
- 生命周期与会话绑定,支持Memory引擎,会话结束,数据表会销毁
- 临时表,不属于任何数据,所以在创建语句中,既没有数据库参数也没有表引擎参数
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─┐
│ 202107 │ 202107_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
并不是任意数据表之间都能够相互复制,需要满足以下条件
- 两张表需要相同的分区键
- 表结构需要完全相同
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支持两种视图
- 普通视图
- 简单的查询代理
- 不会存储任何数据,只是单纯的 select 查询映射,只能简化查询,明晰语义,对查询性能不会有任何提升
物化视图
- 支持表引擎,数据保存形式由它的表引擎决定
- populate
- 如果使用populate修饰,会将源数据表的数据全部导入
- 物化视图不支持同步删除,如果在源数据表中删除了数据,物化视图仍会保留
- 物化视图如果创建好,当源数据表被写入数据,物化视图也会同步更新
- 物化视图本身是一张特殊的表,使用 .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引擎下一次合并动作触发时,这些非激活目录才会被真正从物理意义上删除;