目錄
- 1. MergeTree簡介
- 2. MergeTree表引擎的建立
- 3. 儲存結構
- 4. 資料分區
- 5. 一級索引
- 6. 二級索引
- 7. 資料儲存
- 8. 資料标記
- 9. 分區、索引、标記和壓縮資料的協同總結
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一樣,隻是不用
參數,因為自動按照非字元、數字的方式切割字元串成token短語n
7. 資料儲存
todo
8. 資料标記
todo
9. 分區、索引、标記和壓縮資料的協同總結
todo