[Clickhouse] Engine: MergeTree

MergeTree๋Š” clickhouse์˜ ํ•ต์‹ฌ์ด ๋˜๋Š” ํ…Œ์ด๋ธ” ์—”์ง„์ด๋‹ค.
clickhouse์˜ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋ฉด, MergeTree๋‚˜ MergeTree์˜ ๋ณ€์ข…์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

MergeTree์˜ ๋ณ€์ข…์œผ๋กœ๋Š” ReplacingMergeTree, AggregatingMergeTree๊ฐ€ ์žˆ๋‹ค. ๊ธฐ๋ฐ˜์€ ๊ฐ™์œผ๋‚˜ ์ผ๋ถ€ ํŽธ์˜์„ฑ์ด๋‚˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ด€์ ์ด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฝ๊ธฐ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ํฌ์ƒํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํŠธ๋žœ์žญ์…˜๋„ ์—†๊ณ , ์ˆ˜์ •/์‚ญ์ œ๋„ ์ž˜ ์•ˆ๋˜๊ณ , ์œ ์ผํ‚ค ์ œ์•ฝ ๊ฐ™์€ ๊ฒƒ๋„ ์‚ฌ์‹ค์ƒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ทธ๋ž˜์„œ ์ด๊ฑธ ๋ฉ”์ธDB๋กœ ์“ด๋‹ค๋ฉด ๋งŽ์€ ์• ๋กœ์‚ฌํ•ญ์ด ๊ฝƒํ•„ ๊ฒƒ์ด๋‹ค.




ํ…Œ์ด๋ธ” ์ƒ์„ฑ

MergeTree๋ฅผ ์—”์ง„์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.
Primary Key๋‚˜ Order By ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ˜๋“œ์‹œ ์ง€์ •๋˜์–ด์•ผ ํ•œ๋‹ค.




Granule ๊ตฌ์กฐ

Granule์ด๋ผ๊ณ  ํ•˜๋Š” ๊ณ ์œ ์˜ ์ €์žฅ ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ปดํŒฉํŠธํ•˜๊ฒŒ ์ €์žฅํ•˜๊ณ , ๋น ๋ฅธ ํ’€์Šค์บ”์— ์œ ๋ฆฌํ•œ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://blog.naver.com/sssang97/223652951126




Primary Key์™€ Order By

์˜์™ธ๋กœ Primary Key๋Š” ํ•„์ˆ˜์ ์ธ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ORDER BY๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ORDER BY ์ปฌ๋Ÿผ์ด ์ž๋™์œผ๋กœ Primary Key๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ •๋ ฌํ‚ค์™€ ๊ธฐ๋ณธํ‚ค๊ฐ€ ๊ฑฐ์˜ ๋™์ผํ•˜๋‹ค๊ณ  ๋ด๋„ ๋œ๋‹ค.

์ •๋ ฌํ‚ค, ํ˜น์€ ๊ธฐ๋ณธํ‚ค์˜ ์„ ํƒ์€ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์— ์žˆ์–ด์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋‹ค.
์‹ค์ œ ์ฟผ๋ฆฌ ํŒจํ„ด์— ๋งž์ถฐ์„œ ์ •๋ ฌํ‚ค๋ฅผ ์ž˜ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ตœ์ ํ™” ํŒจํ„ด์— ๋Œ€ํ•ด์„œ๋Š” ๋ณ„๋„ ํฌ์ŠคํŠธ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธํ‚ค๊ฐ€ ์žˆ๊ธด ํ•˜์ง€๋งŒ ๊ธฐ๋ณธํ‚ค๋‚˜ ์ •๋ ฌํ‚ค๋‚˜ ๋‹ค๋ฅธ DB์˜ ๊ธฐ๋ณธํ‚ค์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
๊ธฐ๋ณธํ‚ค๋Š” ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ธฐ๋ณธํ‚ค ๊ธฐ์ค€์œผ๋กœ ์ค‘๋ณต์„ ๋ฐฐ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณ€์ข…์ธ ReplacingMergeTree์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.





Secondary Index (Skip Index)

๋ณด์กฐ ์ธ๋ฑ์Šค๋Š” Skip Index๋ผ๋Š” ๋น„๊ต์  ์ด์งˆ์ ์ธ ๋ฐฉ๋ฒ•๋ก ์„ ์ฐจ์šฉํ•œ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://blog.naver.com/sssang97/223926075870




ํŒŒํ‹ฐ์…˜

MergeTree๋Š” ์„ ํƒ์ ์ธ ์Šค์บ”์„ ์œ„ํ•œ ํŒŒํ‹ฐ์…˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
https://clickhouse.com/docs/engines/table-engines/mergetree-family/custom-partitioning-key

PARTITION BY (ํŒŒํ‹ฐ์…˜ ํ‚ค ๋ชฉ๋ก, ...)

ํŒŒํ‹ฐ์…˜ ๊ฐ’์„ ํ…Œ์ด๋ธ” ์ •์˜์‹œ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

๋งŒ์•ฝ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ์›”๋ณ„๋กœ ํŒŒํ‹ฐ์…˜ํ•ด์„œ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌ๋ฉด ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ธฐ์ค€์œผ๋กœ ์‹ค์ œ๋กœ ๋ธ”๋ก์ด ๋ณ„๋„๋กœ ์ €์žฅ๋œ๋‹ค.
์ด ๊ฒฝ์šฐ ํŒŒํ‹ฐ์…˜ ํ‚ค๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ „์ฒด ์กฐํšŒ๋ฅผ ํ•œ๋‹ค๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋‚˜, ํŒŒํ‹ฐ์…˜ ๋‹จ์œ„์˜ ์ ‘๊ทผ์„ ์ž์ฃผ ํ•  ๋•Œ๋Š” ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํŒŒํ‹ฐ์…˜์˜ ์นด๋””๋„๋ฆฌํ‹ฐ๋Š” ๋„ˆ๋ฌด ๋†’์•„์„œ๋Š” ์•ˆ๋œ๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.
์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด ํŒŒํ‹ฐ์…˜ ๋‹จ์œ„๋Š” ์›” ๋‹จ์œ„๊นŒ์ง€๋Š” ์ ์ ˆํ•˜๋‚˜, ์ฃผ๋‚˜ ์ผ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ๋ชปํ•˜๋‹ค.





์“ฐ๊ธฐ ํ›„ ์ฝ๊ธฐ

Elasticsearch์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์„ฑ๋Šฅ์— ์ตœ์ ํ™”๋œ DB๋“ค์ด ์œผ๋ ˆ ๊ทธ๋ ‡๋“ฏ์ด, ์“ฐ๊ธฐ์— ๋”œ๋ ˆ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ๋ฐ์ดํ„ฐ ์ˆ˜์ •์„ ํ•˜๋”๋ผ๋„ ๋ฐ”๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์ด๋Ÿฐ ์ œํ•œ์„ ์—ผ๋‘์— ๋‘ฌ์•ผ ํ•œ๋‹ค.




TTL

๋ฐ์ดํ„ฐ ๋งŒ๋ฃŒ/์ •๋ฆฌ๋ฅผ ์œ„ํ•œ TTL ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค.
https://clickhouse.com/docs/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl
MergeTree์˜ TTL์€ ์ปฌ๋Ÿผ๊ณผ ํ…Œ์ด๋ธ”์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ปฌ๋Ÿผ์— ์ง€์ •ํ•  ๊ฒฝ์šฐ์—๋Š” ๋งŒ๋ฃŒ์‹œ ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ฐ”๋€Œ๊ณ , ํ…Œ์ด๋ธ”์— ์ง€์ •ํ•  ๊ฒฝ์šฐ์—๋Š” ๋งŒ๋ฃŒ์‹œ ํ•ด๋‹น ํ–‰์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ณผ๋ฅจ์œผ๋กœ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

CREATE TABLE tab
(
    created_at DateTime,
    some_value String TTL created_at + INTERVAL 1 MONTH, -- ์ปฌ๋Ÿผ TTL. d ๊ธฐ์ค€ 1๋‹ฌ ํ›„์— ๋งŒ๋ฃŒ
    c String
)
ENGINE = MergeTree
ORDER BY created_at;

CREATE TABLE tab2
(
    created_at DateTime,
    value Int
)
ENGINE = MergeTree
ORDER BY created_at
TTL created_at + INTERVAL 1 MONTH DELETE, -- 1๋‹ฌ ์ง€๋‚˜๋ฉด ์‚ญ์ œ
    created_at + INTERVAL 1 WEEK TO VOLUME 'aaa', -- 1์ฃผ ์ง€๋‚˜๋ฉด ๋ณผ๋ฅจ์„ aaa๋กœ ์ด๋™


์ฐธ์กฐ
https://clickhouse.com/docs/engines/table-engines/mergetree-family/mergetree
https://clickhouse.com/docs/engines/table-engines/mergetree-family/custom-partitioning-key