clickhouse mergeTree具体学习

百度网盘:https://pan.baidu.com/s/19gFo-FhMuQVUu7zSs4xUZQ,提取码:yyds 阿里云盘:https://www.aliyundrive.com/s/xAcwnztJwZB,提取码:e83r

https://zhuanlan.zhihu.com/p/349105024

命令连接 clickhouse

参考文档

1
2
3
4
5
6
7
 clickhouse-client
 
 # 查看数据库
 
 # 创建数据库
 
 create database if not exists test 

使用 dbeaver 连接数据库

使用 dbeaver 连接数据库记录


创建表

1
2
3
4
5
use test

create table test01 (id UInt8, name String) ENGINE = MergeTree() order by id
 
-- 创建的时候要指定 id

分区合并

分区后,面对涉及 跨分区的查询统计, clickhouse会以分区为单位进行处理。

数据写入与分区合并

任何一个批次的数据写入都会产生一个临时分区,不会纳入任何一个已有的分区。 写入后的某个时刻(大概10-15分钟后), clickhouse 会自动执行合并操作 (等不及也可以手动通过 optimize 执行),把临时分区数据合并到已有分区中

1
2
3
4
5
optimize table  xxx final

-- 例如
 insert into test01 (*) VALUES (1,'aa');
-- 注意点: clickhouse 的字符串只能单引号

合并分区过程演示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 insert into test01 values (3,'cc');
 SELECT * FROM test01;
 
/*
 Query id: 78754aa9-1b0e-44a3-b049-830589adcdde

┌─id─┬─name─┐
│  1 │ aa   │
│  1 │ bb   │
└────┴──────┘
┌─id─┬─name─┐
│  3 │ cc   │
└────┴──────┘
 */
 
 
 optimize table test01 final
 
 -- 我也可以只合并某个分区
 optimize table t_order_mt partition '20200624' final;
 
 
 /*
 
 
┌─id─┬─name─┐
│  1 │ aa   │
│  1 │ bb   │
│  3 │ cc   │
└────┴──────┘
 
 */
 

查看 clickhouse 的数据文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
root@025d2ab03543:/var/lib/clickhouse/data/test/test01# pwd
/var/lib/clickhouse/data/test/test01

<<NOTE
drwxr-x--- 2 clickhouse clickhouse 152 Dec  7 10:44 all_1_3_2
drwxr-x--- 2 clickhouse clickhouse 152 Dec  7 10:47 all_4_4_0
drwxr-x--- 2 clickhouse clickhouse   6 Dec  7 10:32 detached

all 表示 分区 ,1 表示 第一个编号,最大是 3, 2 是表示 执行了 2次合并
NOTE

partition 列存储分区的名称。此示例中有两个分区:201901201902。在 ALTER … PARTITION 语句中你可以使用该列值来指定分区名称。

name 列为分区中数据片段的名称。在 ALTER ATTACH PART 语句中你可以使用此列值中来指定片段名称。

这里我们拆解下第一个数据片段的名称:201901_1_3_1

  • 201901 是分区名称。
  • 1 是数据块的最小编号。
  • 3 是数据块的最大编号。
  • 1 是块级别(即在由块组成的合并树中,该块在树中的深度)。

稀疏索引

略过

order by(必选)

order by 设定了 分区内的数据按照哪些字段顺序进行有序保存

order by 是 MergeTree 中唯一一个必填项,甚至比 primary key 还重要, 运维 当用户不设置主键的时候, 很多处理还是按照 order by 的字段进行处理(比如后面会讲的去重和汇总)。

**要求: 主键必须是order by字段的前缀字段 **

其他笔记

[[post/14.新语言学习记录/中间件工具/clickHouse/clickhouse相关的引擎 | clickhouse引擎记录]]