|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

 

 

posted on   yanqi_vip  阅读(16)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示