clickhouse之mergeTree

mergeTree

數(shù)據(jù)存儲(chǔ)方式

數(shù)據(jù)庫(kù)表在clickhouse中是分塊存儲(chǔ)(如果 partitioning key 存在則使用定義的鍵分塊)绎谦,每一塊又分為文件存儲(chǔ)理逊,每一塊的存儲(chǔ)方式有2中wide和compact窿侈。
wide: 每一列存一個(gè)單獨(dú)的文件
compact: 所有列都存在一個(gè)文件中扼雏。compact格式可以提高插入量少插入頻率頻繁時(shí)的性能屿岂。
存儲(chǔ)方式由min_bytes_for_wide_part和min_rows_for_wide_part控制。如果這兩個(gè)參數(shù)都未設(shè)置則作郭,默認(rèn)為wide。

每一塊存儲(chǔ)在邏輯上又拆分為顆粒弦疮。顆粒的配置參數(shù)為index_granularity 和index_granularity_bytes夹攒。

主鍵

  • 主鍵可以重復(fù)
  • 主鍵可以是多列的組合
  • 主鍵選擇依據(jù)是該列上有查詢條件,并且查詢條件可過濾掉的數(shù)據(jù)量越大那么主鍵的索引效率就越高胁塞。因?yàn)槭褂弥麈I排序咏尝,主鍵的一致性越高,壓縮就越大啸罢。在 CollapsingMergeTree 和SummingMergeTree引擎中將排序字段作為主鍵可以提供額外的邏輯编检。
  • 主鍵越長(zhǎng)會(huì)影響插入效率和內(nèi)存使用。
  • 如果未指明主鍵扰才,則使用sort by 的數(shù)據(jù)作為主鍵允懂。

主鍵和排序鍵不同的意義

這經(jīng)常發(fā)生在SummingMergeTree和AggregatingMergeTree中,因?yàn)檫^濾條件where和聚集條件group by很可能不一樣衩匣。所以主鍵通過where條件選擇蕾总,排序鍵根據(jù)group by選擇。保證了插入和集合的效率琅捏。

索引選擇

根據(jù)where或者prewhere條件匹配程度選擇索引生百,包括in條件,前部分固定的like語(yǔ)句(不以%開頭)柄延,主鍵置侍,分區(qū)鍵,列的重復(fù)方法拦焚,以及上述條件的邏輯關(guān)系。
分區(qū)鍵即是作為分區(qū)查詢的依據(jù)杠输,也需要在主鍵中引入赎败,不然在分區(qū)內(nèi)部無法有效查詢。

--ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate) SETTINGS index_granularity=8192
--不走所有
SELECT count() FROM table WHERE CounterID = 34 OR URL LIKE '%upyachka%'

部分單調(diào)主鍵蠢甲。如1-30日在1個(gè)月中是單調(diào)函數(shù)僵刮,但在更長(zhǎng)的期間不是。如果查詢范圍剛好在這個(gè)月那么clickhouse會(huì)使用這個(gè)索引鹦牛,如果查詢條件不包含單調(diào)序列區(qū)間搞糕,則進(jìn)行全表掃描。

數(shù)據(jù)跳躍索引

-- 語(yǔ)法
INDEX index_name expr TYPE type(...) GRANULARITY granularity_value

--示例
CREATE TABLE table_name
(
    u64 UInt64,
    i32 Int32,
    s String,
    ...
    INDEX a (u64 * i32, s) TYPE minmax GRANULARITY 3,
    INDEX b (u64 * length(s)) TYPE set(1000) GRANULARITY 4
) ENGINE = MergeTree()
...;

--查詢示例
SELECT count() FROM table WHERE s < 'z';
SELECT count() FROM table WHERE u64 * i32 == 10 AND u64 * length(s) >= 1234;

其中type
minmax: 和主鍵查詢等效
set(max_rows)
ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)
tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)
bloom_filter([false_positive])
其中后三者使用bloom索引曼追,可以優(yōu)化 like '%test%'

mergetree

mergeTree Replication 作用
MergeTree ReplicatedMergeTree
ReplacingMergeTree ReplicatedReplacingMergeTree 數(shù)據(jù)合并階段替代方式合并排序鍵相同的數(shù)據(jù)窍仰,用于保證存儲(chǔ)空間,不保證數(shù)據(jù)不重復(fù)
SummingMergeTree ReplicatedSummingMergeTree 數(shù)據(jù)合并階段合計(jì)方式合并排序鍵相同的數(shù)據(jù)礼殊,用于提高聚合效率
AggregatingMergeTree ReplicatedAggregatingMergeTree 數(shù)據(jù)合并階段組合的聚合函數(shù)方式合并排序鍵相同的數(shù)據(jù)
CollapsingMergeTree ReplicatedCollapsingMergeTree 數(shù)據(jù)合并階段折疊(抵消)方式合并排序鍵相同的數(shù)據(jù)驹吮,用于減少更新操作针史,clickhouse更新操作很昂貴(最初版本不支持更新)
VersionedCollapsingMergeTree ReplicatedVersionedCollapsingMergeTree 通過版本控制刪除舊版本數(shù)據(jù),比CollapsingMergeTree多了版本列
GraphiteMergeTree ReplicatedGraphiteMergeTree 存儲(chǔ)監(jiān)控工具graphite數(shù)據(jù)

只能在單獨(dú)的服務(wù)器上運(yùn)行的命令:CREATE, DROP, ATTACH, DETACH, RENAME
clickhouse 集群使用zookeeper
集群的時(shí)候建議插入頻率每秒不超過一次
插入語(yǔ)句只等待1個(gè)服務(wù)的操作碟狞,單這個(gè)服務(wù)異常退出的時(shí)候啄枕,插入數(shù)據(jù)會(huì)丟失,保證多副本確認(rèn)可使用insert_quorum

分區(qū)

數(shù)據(jù)插入是存在單獨(dú)的分區(qū)族沃,然后按分區(qū)鍵進(jìn)行數(shù)據(jù)合并频祝。合并是周期性進(jìn)行了10-15分鐘。還有非周期性執(zhí)行命令OPTIMIZE,但不能依賴此命令(應(yīng)該是異步的)脆淹。

--查詢分區(qū)
SELECT
    partition,
    name,
    active
FROM system.parts
WHERE table = 'visits'

--立即優(yōu)化
OPTIMIZE TABLE visits PARTITION 201902;

舉例

summingMergeTree舉例
CREATE TABLE summtt
(
    key UInt32,
    value UInt32
)
ENGINE = SummingMergeTree()
ORDER BY key;

INSERT INTO summtt Values(1,1),(1,2),(2,1);
INSERT INTO summtt Values(1,1),(1,2),(2,1);

SELECT * FROM summtt;

--執(zhí)行結(jié)果如下
┌─key─┬─value─┐
│   1 │     1 │
│   1 │     2 │
│   2 │     1 │
└─────┴───────┘
┌─key─┬─value─┐
│   1 │     1 │
│   1 │     2 │
│   2 │     1 │
└─────┴───────┘

6 rows in set. Elapsed: 0.090 sec. 

optimize table summtt partition tuple();
SELECT * FROM summtt;
┌─key─┬─value─┐
│   1 │     6 │
│   2 │     2 │
└─────┴───────┘

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末常空,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子未辆,更是在濱河造成了極大的恐慌窟绷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咐柜,死亡現(xiàn)場(chǎng)離奇詭異兼蜈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拙友,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門为狸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遗契,你說我怎么就攤上這事辐棒。” “怎么了牍蜂?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵漾根,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鲫竞,道長(zhǎng)辐怕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任从绘,我火速辦了婚禮寄疏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僵井。我一直安慰自己陕截,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布批什。 她就那樣靜靜地躺著农曲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪驻债。 梳的紋絲不亂的頭發(fā)上朋蔫,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天罚渐,我揣著相機(jī)與錄音,去河邊找鬼驯妄。 笑死荷并,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的青扔。 我是一名探鬼主播源织,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼微猖!你這毒婦竟也來了谈息?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤凛剥,失蹤者是張志新(化名)和其女友劉穎侠仇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犁珠,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逻炊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了犁享。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片余素。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炊昆,靈堂內(nèi)的尸體忽然破棺而出桨吊,到底是詐尸還是另有隱情,我是刑警寧澤凤巨,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布视乐,位于F島的核電站,受9級(jí)特大地震影響敢茁,放射性物質(zhì)發(fā)生泄漏炊林。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一卷要、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧独榴,春花似錦僧叉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至症歇,卻和暖如春郎笆,著一層夾襖步出監(jiān)牢的瞬間谭梗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工宛蚓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留激捏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓凄吏,卻偏偏與公主長(zhǎng)得像远舅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痕钢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • MergeTree 允許您依據(jù)主鍵和日期創(chuàng)建索引图柏,并進(jìn)行實(shí)時(shí)的數(shù)據(jù)更新操作。MergeTree 是 ClickHo...
    Jenray閱讀 11,751評(píng)論 1 7
  • 前言 筆者在之前的文章中已經(jīng)提到過,MergeTree引擎族是ClickHouse強(qiáng)大功能的基礎(chǔ)随抠。MergeTre...
    LittleMagic閱讀 4,846評(píng)論 9 23
  • MergeTree 表引擎 基本介紹 MergeTree是ClickHouse特有的一種數(shù)據(jù)表存儲(chǔ)裁着、處理引擎。 M...
    Neuroway閱讀 4,815評(píng)論 4 5
  • ClickHouse表引擎決定了: 數(shù)據(jù)的存儲(chǔ)方式和位置暮刃,寫到哪里以及從哪里讀取數(shù)據(jù)跨算; 支持哪些查詢以及如何支持;...
    mysia閱讀 809評(píng)論 0 3
  • 久違的晴天椭懊,家長(zhǎng)會(huì)诸蚕。 家長(zhǎng)大會(huì)開好到教室時(shí),離放學(xué)已經(jīng)沒多少時(shí)間了氧猬。班主任說已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)背犯。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評(píng)論 16 22