栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Clickhouse

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Clickhouse

生生不息,“折腾”不止;Java晋升指北,让天下没有难学的技术


一、数据类型

同MySQL,大同小异

二、数据库

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

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

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

    DefaultMaterializedAlias
类型支持显示赋值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引擎下一次合并动作触发时,这些非激活目录才会被真正从物理意义上删除;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/754392.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号