Clickhouse MergeTree表引擎的原理解析

1. MergeTree简介

数据写入时按partition by字段进行分区储存到磁盘,同一个分区的数据会定期合并成一个新的片段

只有MergeTree有数据副本、数据分区(partition by)、主键索引、数据采样(sample by)和alter table操作

2. MergeTree表引擎的创建

clickhouse1 :) 
clickhouse1 :) CREATE TABLE IF NOT EXISTS default.merge_tree_test_local ON CLUSTER sharding_ha
:-] (
:-]     `id` UInt64 DEFAULT 0,
:-]     `name` String DEFAULT '',
:-]     `created_date` DateTime,
:-]     INDEX minmax_index (id, name) TYPE minmax GRANULARITY 5,
:-]     INDEX set_index length(name) TYPE set(4) GRANULARITY 5,
:-]     INDEX ngrambf_v1_index name TYPE ngrambf_v1(3, 256, 2, 0) GRANULARITY 5,
:-]     INDEX tokenbf_v1_index name TYPE tokenbf_v1(256, 2, 0) GRANULARITY 5
:-] )
:-] ENGINE = ReplicatedMergeTree('/clickhouse/tables/merge_tree_test/{shard}', '{replica}')
:-] PARTITION BY toYYYYMMDD(created_date)
:-] PRIMARY KEY (id, javaHash(name))
:-] ORDER BY (id, javaHash(name), created_date)
:-] SAMPLE BY javaHash(name)
:-] SETTINGS enable_mixed_granularity_parts = 1, index_granularity_bytes = 10485760, index_granularity = 8192;

CREATE TABLE IF NOT EXISTS default.merge_tree_test_local ON CLUSTER sharding_ha
(
    `id` UInt64 DEFAULT 0,
    `name` String DEFAULT '',
    `created_date` DateTime,
    INDEX minmax_index (id, name) TYPE minmax GRANULARITY 5,
    INDEX set_index length(name) TYPE set(4) GRANULARITY 5,
    INDEX ngrambf_v1_index name TYPE ngrambf_v1(3, 256, 2, 0) GRANULARITY 5,
    INDEX tokenbf_v1_index name TYPE tokenbf_v1(256, 2, 0) GRANULARITY 5
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/merge_tree_test/{shard}', '{replica}')
PARTITION BY toYYYYMMDD(created_date)
PRIMARY KEY (id, javaHash(name))
ORDER BY (id, javaHash(name), created_date)
SAMPLE BY javaHash(name)
SETTINGS enable_mixed_granularity_parts = 1, index_granularity_bytes = 10485760, index_granularity = 8192

Query id: 29a770fa-87e4-478c-b4a8-12216fcdc4b4

┌─host────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ clickhouse2 │ 9000 │      0 │       │                   3 │                0 │
│ clickhouse3 │ 9000 │      0 │       │                   2 │                0 │
│ clickhouse1 │ 9000 │      0 │       │                   1 │                0 │
│ clickhouse4 │ 9000 │      0 │       │                   0 │                0 │
└─────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.330 sec. 

clickhouse1 :)

说明:

  • partition by: 支持列表达式、元组形式的多个字段(colA, colB)
  • order by: 必填
  • primary key: 形成一级索引,必须是order by字段的前缀,默认和order by字段一样,允许存在相同primary key的数据

3. 储存结构

todo

4. 数据分区

分区ID的生成规则

  • 不指定分区键:分区ID为all, 所有数据都保存到这个分区
  • 整型分区键:该分区键无法转换为日期类型YYYYMMDD格
    式,则按字符形式输出
  • 日期类型分区键:加上能转换为日期类型YYYYMMDD格式的整型,则按YYYYMMDD格式化后的字符形式输出,或定义的其它格式字符形式输出
  • 其他类型分区键:例如String、Float等,则按128位Hash算法的值输出

如果partition by指定多个分区键,则按上述规则生成分区ID,再用字符"-"依次连接

5. 一级索引

todo

6. 二级索引

由数据的聚合信息构成;默认的index_granularity = 8192, 则granularity 5表示依次计算5个8192条数据,并逐个累加,最后生成1条二级索引;总共有四种

  • minmax: 一条索引记录最小和最大极值
  • set(max_rows): 一条索引最多记录唯一值max_rows个,max_rows = 0表示无限制
  • ngrambf_v1
    只支持String和FixedString类型,能提示in、notIn、like、equals、notEquals的性能
    参数含义:
    n:按n的长度将字符串切割为token短语
    size_of_bloom_filter_in_bytes:布隆过滤器的大小
    ·number_of_hash_functions:token短语使用number个Hash函数映射后再写入
    ·random_seed:Hash函数的随机种子
  • tokenbf_v1
    其它都和ngrambf_v1一样,只是不用n参数,因为自动按照非字符、数字的方式切割字符串成token短语

7. 数据储存

todo

8. 数据标记

todo

9. 分区、索引、标记和压缩数据的协同总结

todo

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值