|NO.Z.00006|——————————|BigDataEnd|——|Hadoop&OLAP_ClickHouse.V03|——|ClickHouse.v03|表引擎|MergeTree|创建方式|存储结构|
一、MergeTree
### --- MergeTree
~~~ Clickhouse 中最强大的表引擎当属 MergeTree (合并树)
~~~ 引擎及该系列(*MergeTree)中的其他引擎。
~~~ MergeTree 引擎系列的基本理念如下。
~~~ 当你有巨量数据要插入到表中,你要高效地一批批写入数据片段,
~~~ 并希望这些数据片段在后台按照一定规则合并。
~~~ 相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。
二、MergeTree的创建方式与存储结构
### --- MergeTree的创建方式:
~~~ # 创建语法
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]
### --- MergeTree创建案例:
~~~ # 创建示例
hadoop01 :) create table mt_table(date Date,id UInt8,name String) engine = MergeTree partition by toYYYYMM(date) order by id;
CREATE TABLE mt_table
(
`date` Date,
`id` UInt8,
`name` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY id
Ok.
~~~ # 创建示例
hadoop01 :) CREATE TABLE mt_table3 ( `date` Date, `id` UInt8, `name` String ) ENGINE = MergeTree PARTITION BY toYYYYMM(date) ORDER BY id ;
CREATE TABLE mt_table3
(
`date` Date,
`id` UInt8,
`name` String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY id
Ok.
### --- 导入数据
~~~ # 导入数据
hadoop01 :) insert into mt_table values ('2021-11-01', 1, 'zhangsan');
hadoop01 :) insert into mt_table values ('2021-11-02', 2, 'lisi');
hadoop01 :) insert into mt_table values ('2021-11-03', 3, 'wangwu');
### --- 在/var/lib/clickhouse/data/default/mt_tree下可以看到:
~~~ # 查看库文件结构
[root@hadoop01 ~]# ll /var/lib/clickhouse/data/default/mt_table
202111_1_1_0
202111_2_2_0
202111_3_3_0
detached
~~~ # 随便进入一个目录:查看目录文件结构
[root@hadoop01 ~]# ll /var/lib/clickhouse/data/default/mt_table/202111_1_1_0/
checksums.txt
columns.txt
count.txt
date.bin
date.mrk2
id.bin
id.mrk2
minmax_date.idx
name.bin
name.mrk2
partition.dat
primary.idx
~~~ # 目录结构说明
~~~ *.bin是按列保存数据的文件
~~~ *.mrk保存块偏移量
~~~ primary.idx保存主键索引
### --- 参数说明
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]
~~~ # ENGINE - 引擎名和参数。
~~~ ENGINE = MergeTree(). MergeTree 引擎没有参数。
~~~ # PARTITION BY — 分区键 。
~~~ 要按月分区,可以使用表达式 toYYYYMM(date_column) ,
~~~ 这里的 date_column 是一个 Date 类型的列。这里该分区名格式会是 "YYYYMM" 这样。
~~~ # ORDER BY — 表的排序键。必选!
~~~ 可以是一组列的元组或任意的表达式。 例如: ORDER BY (CounterID, EventDate) 。
~~~ # PRIMARY KEY - 主键,
~~~ 如果要设成 跟排序键不相同。
~~~ 默认情况下主键跟排序键(由 ORDER BY 子句指定)相同。
~~~ 因此,大部分情况下不需要再专门指定一个PRIMARY KEY 子句。
~~~ # SAMPLE BY — 用于抽样的表达式。
~~~ 如果要用抽样表达式,主键中必须包含这个表达式。
~~~ 例如: SAMPLE BY intHash32(UserID) ORDER BY(CounterID, EventDate, intHash32(UserID)) 。
~~~ # SETTINGS — 影响 MergeTree 性能的额外参数:
~~~ index_granularity — 索引粒度。即索引中相邻『标记』间的数据行数。默认值,8192 。
~~~ 该列表中所有可用的参数可以从这里查看 MergeTreeSettings.h
~~~ index_granularity_bytes — 索引粒度,以字节为单位,默认值: 10Mb。
~~~ 如果仅按数据行数限制索引粒度,请设置为0(不建议)。
~~~ enable_mixed_granularity_parts — 启用或禁用通过 index_granularity_bytes 控制索引粒度的大小。
~~~ 在19.11版本之前, 只有 index_granularity 配置能够用于限制索引粒度的大小。
~~~ 当从大表(数十或数百兆)中查询数据时候,index_granularity_bytes 配置能够提升ClickHouse的性能。
~~~ 如果你的表内数据量很大,可以开启这项配置用以提升SELECT 查询的性能。
~~~ use_minimalistic_part_header_in_zookeeper — 数据片段头在 ZooKeeper 中的存储方式。
~~~ 如果设置了use_minimalistic_part_header_in_zookeeper=1 ,ZooKeeper 会存储更少的数据。
~~~ 更多信息参考『服务配置参数』这章中的 设置描述 。
~~~ min_merge_bytes_to_use_direct_io — 使用直接 I/O 来操作磁盘的合并操作时要求的最小数据量。
~~~ 合并数据片段时,ClickHouse 会计算要被合并的所有数据的总存储空间。
~~~ 如果大小超过了min_merge_bytes_to_use_direct_io 设置的字节数,
~~~ 则 ClickHouse 将使用直接 I/O 接口(O_DIRECT 选项)对磁盘读写。
~~~ 如果设置 min_merge_bytes_to_use_direct_io = 0 ,则会禁用直接 I/O。
~~~ 默认值:10 *1024 * 1024 * 1024 字节。
~~~ merge_with_ttl_timeout — TTL合并频率的最小间隔时间。默认值: 86400 (1 天)。
~~~ write_final_mark — 启用或禁用在数据片段尾部写入最终索引标记。默认值: 1(不建议更改)。
~~~ storage_policy — 存储策略。 参见 使用多个区块装置进行数据存储.
三、MergeTree存储结构
### --- MergeTree的存储结构
[root@hadoop01 ~]# cd /var/lib/clickhouse/data/default/mt_table/
[root@hadoop01 mt_table]# tree
.
├── 202111_1_1_0
│ ├── checksums.txt
│ ├── columns.txt
│ ├── count.txt
│ ├── date.bin
│ ├── date.mrk2
│ ├── id.bin
│ ├── id.mrk2
│ ├── minmax_date.idx
│ ├── name.bin
│ ├── name.mrk2
│ ├── partition.dat
│ └── primary.idx
├── 202111_2_2_0
│ ├── checksums.txt
│ ├── columns.txt
│ ├── count.txt
│ ├── date.bin
│ ├── date.mrk2
│ ├── id.bin
│ ├── id.mrk2
│ ├── minmax_date.idx
│ ├── name.bin
│ ├── name.mrk2
│ ├── partition.dat
│ └── primary.idx
├── 202111_3_3_0
│ ├── checksums.txt
│ ├── columns.txt
│ ├── count.txt
│ ├── date.bin
│ ├── date.mrk2
│ ├── id.bin
│ ├── id.mrk2
│ ├── minmax_date.idx
│ ├── name.bin
│ ├── name.mrk2
│ ├── partition.dat
│ └── primary.idx
├── detached
└── format_version.txt
### --- checksums.txt
~~~ 二进制的校验文件,保存了余下文件的大小size和size的Hash值,用于快速校验文件的完整和正确性
~~~ columns.txt:明文的列信息文件,如:
[root@hadoop01 ~]# cd /var/lib/clickhouse/data/default/mt_table/202111_1_1_0/
[root@hadoop01 202111_1_1_0]# cat columns.txt
columns format version: 1
3 columns:
`date` Date
`id` UInt8
`name` String
~~~ # date.bin
~~~ 压缩格式(默认LZ4)的数据文件,保存了原始数据。以列名.bin命名。
~~~ # date.mrk2
~~~ 使用了自适应大小的索引间隔,名字为 .mrk2
~~~ 二进制的列字段标记文件,作用是把稀疏索引.idx文件和存数据的文件.bin联系起来。
~~~ 详见数据标记一节id.bin id.mrk2 name.bin name.mrk2
~~~ # primary.idx
~~~ 二进制的一级索引文件,在建表的时候通过OrderBy或者PrimaryKey声明的稀疏索引。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?