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