天天看點

Clickhouse MergeTree表引擎的原了解析1. MergeTree簡介2. MergeTree表引擎的建立3. 儲存結構4. 資料分區5. 一級索引6. 二級索引7. 資料儲存8. 資料标記9. 分區、索引、标記和壓縮資料的協同總結

目錄

  • 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一樣,隻是不用

    n

    參數,因為自動按照非字元、數字的方式切割字元串成token短語

7. 資料儲存

todo

8. 資料标記

todo

9. 分區、索引、标記和壓縮資料的協同總結

todo

繼續閱讀