This commit is contained in:
2021-11-14 15:52:46 +08:00
parent 915c231124
commit 1e344dc204
112 changed files with 1039 additions and 1039 deletions

View File

@@ -6,12 +6,12 @@ tags: []
categories: ["clickhouse"]
---
# 简介
## 简介
- 支持主键索引、数据分区、数据副本、数据采样、ALTER 操作
- 扩展表引擎丰富,生产环境中大多使用该表引擎
- 数据以片段形式写入磁盘,后台定期合并片段到各分区相应片段
# 数据表
## 数据表
- 建表语句
```sql
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name(
@@ -35,7 +35,7 @@ categories: ["clickhouse"]
- merge_with_ttl_timeout: TTL 合并间隔时间,默认 86400(1天)
- storage_policy: 数据在硬盘上的存储策略
# 数据文件
## 数据文件
- 目录和文件
```
table_name # 表名目录
@@ -53,8 +53,8 @@ categories: ["clickhouse"]
|___ skp_idx_{column_name}.mrk # 二级索引(跳数索引)列的标记文件
```
# 数据分区
## 分区 ID
## 数据分区
### 分区 ID
- 单字段分区 ID 生成规则
类型 | 样例数据 | 分区表达式 | 分区 ID
@@ -68,7 +68,7 @@ categories: ["clickhouse"]
- 多字段(元组)分区时, 先按单字段生成对应 ID再用 "-" 拼接
## 分区目录
### 分区目录
- 分区目录命名: PartitionID_MinBlockNum_MaxBlockNum_Level例如 202010_1_1_0
- PartitionID: 分区 ID
- MinBlockNum: 最小数据块编号,**表内全局累加**,从 1 开始
@@ -83,7 +83,7 @@ categories: ["clickhouse"]
- MaxBlockNum: 所有合并目录中的最大 MaxBlockNum
- Level: 所有合并目录中的最大 Level 值并加 1
# 数据索引
## 数据索引
- 常驻内存
- 一级索引是稀疏索引,间隔 index_granularity (默认 8192) 行数据生成一条索引记录
- 二级索引又称跳数索引,有数据的聚合信息构建而成,在 CREATE 语句中定义如下:
@@ -119,7 +119,7 @@ categories: ["clickhouse"]
-- 注意传参时不需要指定 token 长度
```
# 数据存储
## 数据存储
- 按列独立存储
- 默认 LZ4 压缩
- 按照 order by 排序
@@ -128,20 +128,20 @@ categories: ["clickhouse"]
- 64KB <= 单批次数据 <= 1MB直接生成压缩数据块
- 单批次数据 > 1MB按照 1MB 大小截断并生成数据块,剩余数据继续按前面规则执行
# 数据标记
## 数据标记
- 使用 LRU 策略缓存
- 每一行标记数据记录的是一个数据片段在 .bin 文件中的读取位置
# 数据写入
## 数据写入
- 生成分区目录,合并分区相同的目录
- 按照 index_granularity 索引粒度,生成一级索引、二级索引、数据标记文件和数据压缩文件
# 数据查询
## 数据查询
- 借助分区、索引、数据标记来缩小扫描范围
- 如果未指定查询条件或条件未匹配到索引MergeTree 仍可借助数据标记多线程读取压缩数据块
# 数据 TTL
## TTL 机制
## 数据 TTL
### TTL 机制
- TTL 信息保存在分区目录中的 ttl.txt 中
- 支持的时间单位: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR
- 触发 TTL 删除过期数据
@@ -158,7 +158,7 @@ categories: ["clickhouse"]
SYSTEM STOP TTL MERGES;
```
## 列级别 TTL
### 列级别 TTL
- 到达时间时,列数据被还原为对应数据类型的默认值
- 主键字段不能被声明 TTL
- 声明列级别 TTL
@@ -178,7 +178,7 @@ categories: ["clickhouse"]
ALTER TABLE table_name MODIFY COLUMN code String TTL create_time + INTERVAL 1 DAY;
```
## 表级别 TTL
### 表级别 TTL
- 到达时间时,删除过期的数据行
- 声明表级别 TTL
```sql
@@ -198,24 +198,24 @@ categories: ["clickhouse"]
ALTER TABLE table_name MODIFY TTL create_time + INTERVAL 3 DAY;
```
# 存储策略
## 存储策略
- 最小移动单元是数据分区
- 三大策略: 默认、JBOD、HOT/COLD
## 默认策略
### 默认策略
- 无需配置,所有分区自动保存至 config.xml 中的 path 目录下
## JOB 策略
### JOB 策略
- 适用于多磁盘无 RAID 场景
- INSERT 或 MERGE 产生的新分区轮询写入各磁盘,类似 RAID0
- 磁盘故障时,丢掉相应数据,需要副本机制保障数据可靠性
## HOT/COLD 策略
### HOT/COLD 策略
- 适用于已挂载不同类型磁盘的场景
- 把磁盘划分到 HOT 和 COLD 两个区域HOT 使用 SSD注重性能CODE 使用 HDD注重经济
- 单个区域内可应用 JBOD 策略
## 配置策略
### 配置策略
- 配置示例
```xml
<storage_configuration>
@@ -290,7 +290,7 @@ categories: ["clickhouse"]
ALTER TABLE table_name MOVE PART 'part_name' TO VOLUME 'volume_name';
```
# ReplacingMergeTree
## ReplacingMergeTree
- 依据 ORDER BY 字段去重
- 合并分区时,**以分区为单位**删除重复数据
- 声明
@@ -302,7 +302,7 @@ categories: ["clickhouse"]
- 未指定 version_column 时,保留同一组重复数据中的最后一行
- 指定 version_column 时,保留同一组重复数据中该字段取值最大的一行
# SummingMergeTree
## SummingMergeTree
- 场景: 用户只需要汇总结果,不关心明细
- 依据 ORDER BY 字段聚合
- 合并分区时,触发条件聚合,**以分区为单位**把同一分组下的多行数据汇总成一行
@@ -316,7 +316,7 @@ categories: ["clickhouse"]
- 非汇总字段保留同组内的第一行数据
- 汇总嵌套字段时,字段名需以 Map 为后缀,默认嵌套字段中第一列作为聚合 Key其他以 \*Key、\*Id、\*Type 未后缀名的列会和第一列组成复合 Key
# AggregatingMergeTree
## AggregatingMergeTree
- 预先计算聚合数据,二进制格式存入表中,空间换时间,可看成是 SummingMergeTree 的*升级版*
- 依据 ORDER BY 字段聚合
- 使用 AggregationFunction 字段类型定义聚合函数和字段
@@ -357,7 +357,7 @@ categories: ["clickhouse"]
SELECT id, sumMerge(value), uniqMerge(code) FROM agg_view GROUP BY id,city;
```
# CollapsingMergeTree
## CollapsingMergeTree
- 以增代删
- 声明
```sql
@@ -376,7 +376,7 @@ categories: ["clickhouse"]
- 合并分区时,触发**以分区为单位**的数据折叠
- 严格要求数据写入顺序,只有先写入 sign=1再写入 sign=-1才能正常折叠
# VersionedCollapsingMergeTree
## VersionedCollapsingMergeTree
- 与 CollapsingMergeTree 类似,但对数据写入顺序没有要求
- 声明
```sql