[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