๐ฃ Hook: "์ธ๋ฑ์ค ๊ฑธ์๋๋ฐ ์ ๋๋ฆฌ์ฃ ?"
์ฟผ๋ฆฌ ํ๋์ ์์ ์ ๋๋ค. ํ์ง๋ง ๋๋ก๋ ์ ์์ ์ธ ๋ฐฉ๋ฒ(B-Tree ์ธ๋ฑ์ค ์ถ๊ฐ)๋ง์ผ๋ก๋ ํ๊ณ์ ๋ถ๋ชํ๋๋ค. ์ธ๋ฑ์ค ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ ธ์ ์คํ๋ ค ์ฑ๋ฅ์ ๊ฐ์๋จน๊ธฐ๋ ํ์ฃ .
์ฌ๊ธฐ, Haki Benita๊ฐ ์ ์ํ๋ "๋น์์์ ์ด์ง๋ง ํจ๊ณผ์ ์ธ" ์ต์ ํ ๋ฐฉ๋ฒ 3๊ฐ์ง๋ฅผ ์๊ฐํฉ๋๋ค.
๐ ๏ธ The Techniques
1. ์ฒดํฌ ์ ์ฝ์กฐ๊ฑด(Check Constraints)์ผ๋ก ํ ์ค์บ ํผํ๊ธฐ
๊ฐ๋ฐ์์ ์ค์๋ก ์กด์ฌํ์ง ์๋ ๊ฐ์ ์กฐํํ ๋๊ฐ ์์ต๋๋ค. (์: plan='Pro'์ธ๋ฐ ์ค์ ๋ก๋ plan='pro'๋ก ์ ์ฅ๋จ)
๋ณดํต์ DB๊ฐ ๋ฐ๋ณด์ฒ๋ผ ํ
์ด๋ธ์ ๋ค ๋ค์ง๋๋ค(Full Scan). ํ์ง๋ง Check Constraint๋ฅผ ๊ฑธ์ด๋๋ฉด?
ALTER TABLE users ADD CONSTRAINT check_plan CHECK (plan IN ('free', 'enterprise', 'pro'));
-- ๊ทธ๋ฆฌ๊ณ ์ค์ ์ผ๊ธฐ
SET constraint_exclusion = on;
์ด์ DB๋ plan='Pro' ์ฟผ๋ฆฌ๊ฐ ์ค๋ฉด "์ด? ์ ์ฝ์กฐ๊ฑด์ ์๋ค?" ํ๊ณ ๊ฒ์ ์์ฒด๋ฅผ ์๋ํ์ง ์์ต๋๋ค(0ms).
2. ํจ์ ๊ธฐ๋ฐ ์ธ๋ฑ์ค๋ก ๋ค์ด์ดํธํ๊ธฐ
created_at ๊ฐ์ ํ์์คํฌํ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ๋ฉด ํฌ๊ธฐ๊ฐ ์์ฒญ๋ฉ๋๋ค. ํ์ง๋ง ๋๋ถ๋ถ์ ์กฐํ๋ '๋ ์ง(Day)' ๋จ์๋ก ์ด๋ฃจ์ด์ง๋ค๋ฉด?
-- ์ ์ฒด ํ์์คํฌํ ๋์ ๋ ์ง๋ง ์ธ๋ฑ์ฑ
CREATE INDEX idx_sold_at_date ON sales ((date_trunc('day', sold_at AT TIME ZONE 'UTC')));
์ด๋ ๊ฒ ํ๋ฉด ์ธ๋ฑ์ค ํฌ๊ธฐ๊ฐ 3๋ฐฐ ์ด์ ์ค์ด๋ญ๋๋ค. PG ์์ง์ด ์ค๋ณต๋ ๋ ์ง ๊ฐ๋ค์ ์์ถ(Deduplication)ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
3. Hash ์ธ๋ฑ์ค๋ก ์ ๋ํฌ(Unique) ๊ฑธ๊ธฐ
"URL ๊ฐ์ ๊ธด ๋ฌธ์์ด์ ์ค๋ณต์ ๋ง๊ณ ์ถ๋ค."
๋ณดํต UNIQUE ์ ์ฝ์กฐ๊ฑด์ ๊ฑธ๋ฉด B-Tree ์ธ๋ฑ์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ํ์ง๋ง URL์ ๋๋ฌด ๊ธธ์ด์ ์ธ๋ฑ์ค ์ฉ๋์ ๋ง์ด ์ฐจ์งํฉ๋๋ค.
์ด๋ Hash Index๋ฅผ ์ฐ๋ฉด ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค. (B-Tree ๋๋น 5๋ฐฐ ์์)
-- Exclude Constraint๋ฅผ ์ด์ฉํ ํด์ ์ ๋ํฌ
ALTER TABLE urls ADD CONSTRAINT urls_unique_hash EXCLUDE USING HASH (url WITH =);
์ด์ URL ์์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒ ์๋๋ผ, ํด์๊ฐ๋ง ์ ์ฅํ๋ฏ๋ก ์ฉ๋์ด ํ๊ธฐ์ ์ผ๋ก ์ค์ด๋ญ๋๋ค.
MAX5์ ์๊ฐ ๐ฏ
๐จโ๐ป ๋ฐ์ด๋ธ ์ฝ๋ฉ ๋ ์ํผ
๋ด DB ์คํค๋ง๋ฅผ ๋์ ธ์ฃผ๊ณ "๋น์์์ ์ธ ์ต์ ํ"๋ฅผ ๋งก๊ฒจ๋ณด์.
"์ด ํ
์ด๋ธ ์คํค๋ง(CREATE TABLE...)๋ฅผ ๋ด์ค. URL ์ปฌ๋ผ์ด ์๋๋ฐ ์ค๋ณต ๋ฐฉ์ง๊ฐ ํ์ํด. B-Tree ์ธ๋ฑ์ค ๋์ Hash ์ธ๋ฑ์ค๋ก ์ต์ ํํ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ฃผ๊ณ , ์ฅ๋จ์ ์ ์ค๋ช
ํด์ค."
๐ธ ์ฌ์ด๋ ํ๋ก์ ํธ ์์ด๋์ด
"Unconventional Linter": pg_dump ์คํค๋ง ํ์ผ์ ๋ฃ์ผ๋ฉด, ์ด๋ฐ '๋ณํ์ ์ธ' ์ต์ ํ ํ์ ์ ์ฉํ ์ ์๋ ์ปฌ๋ผ์ ์ฐพ์์ ์ ์ํด์ฃผ๋ CI/CD ๋๊ตฌ. (Check Constraints ํ์ฉ ๊ธฐํ ํฌ์ฐฉ ๋ฑ)
์นดํ
๊ณ ๋ฆฌ: tech_deep_dive, ``