[PostgreSQL] bloom index

Bloom Index๋Š” Bloom Filter ๊ธฐ๋ฐ˜์˜ ์ธ๋ฑ์Šค ํƒ€์ž…์ด๋‹ค.
๊ธฐ๋ณธ ํ™•์žฅ์œผ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ํŠน์ˆ˜ํ•œ ์‚ฌ์šฉ์‚ฌ๋ก€๋ฅผ ์ƒ์ •ํ•˜๊ณ  ์ œ๊ณต๋œ๋‹ค.

๋ธ”๋ฃธ ํ•„ํ„ฐ์— ๋Œ€ํ•œ ์›๋ฆฌ๋Š” ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://blog.naver.com/sssang97/223231946274




์‚ฌ์šฉ๋ฒ•

๋จผ์ € bloom ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค.
๊ธฐ๋ณธ ํ™•์žฅ์œผ๋กœ ํฌํ•จ๋˜์–ด์žˆ๊ธด ํ•˜์ง€๋งŒ, ์ผœ์ ธ์žˆ์ง€๋Š” ์•Š๋‹ค.

CREATE EXTENSION bloom;

๊ทธ๋ฆฌ๊ณ  ๋งŒ๋“ค๋•Œ๋Š” ์ผ๋ฐ˜ ์ธ๋ฑ์Šค ๋งŒ๋“ค๋“ฏ์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

 create index ์ธ๋ฑ์Šค๋ช… on ํ…Œ์ด๋ธ”๋ช… USING bloom (ํ•„๋“œ, ...);



์ œํ•œ์‚ฌํ•ญ

์ด๊ฑด ์ œํ•œ์‚ฌํ•ญ์ด ๋งค์šฐ ๋งŽ์€ ํŽธ์— ์†ํ•œ๋‹ค.
์ผ๋‹จ ๋“ฑ์‹(=) ๊ธฐ๋ฐ˜์˜ ์กฐ๊ฑด์—๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ๋™์ž‘ํ•œ๋‹ค. ๋ฒ”์œ„ ์กฐ๊ฑด ๋“ฑ์—๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•ด์‹œ ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

UNIQUE ์ œ์•ฝ์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” BTree๋ณด๋‹ค ๋А๋ฆฌ๋‹ค.

์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€ ๊ฒฝ์šฐ์—๋งŒ ์ž˜ ๋™์ž‘ํ•œ๋‹ค. ๊ฐ’์˜ ์ค‘๋ณต์ด ๋งŽ๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์•„์˜ˆ ํƒ€์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.




vs BTree

๊ทธ๋Ÿฌ๋ฉด ์ด๊ฑธ ์–ธ์ œ ์จ์•ผํ• ๊นŒ? ์‚ฌ์‹ค ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์‚ฌ๋ก€์—์„œ๋Š” Btree์— ๋ฐ€๋ฆฌ๋Š”๊ฒŒ ์‚ฌ์‹ค์ด๊ณ , ์šฐ์„ ์ ์œผ๋กœ ์„ ํƒํ•˜์ง€๋Š” ์•Š์•„์•ผ ํ•œ๋‹ค.

Bloom ์ธ๋ฑ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์Šค์˜ ํฌ๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ์ž‘๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ๋ณตํ•ฉ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ๋„ ์ธ๋ฑ์Šค์˜ "์ปฌ๋Ÿผ ์ˆœ์„œ"์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋Œ€์ถฉ (a, b, c, d, e)๋กœ ๊ฑธ์–ด๋†“๊ณ  e๋‚˜ c๋งŒ์œผ๋กœ ํ•„ํ„ฐ๋ฅผ ๊ฑธ์–ด๋„ ์ธ๋ฑ์Šค๋ฅผ ํƒ„๋‹ค.




์‚ฌ์šฉํ•ด๋ณด๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ถฉ ์„ธํŒ…ํ•ด๋ณด๊ณ , ์ž˜ ๋„๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

CREATE TABLE benchmark (
    id BIGSERIAL PRIMARY KEY,
    a INT NOT NULL,
    b INT NOT NULL,
    c INT NOT NULL
);

INSERT INTO benchmark (a, b, c)
SELECT
    (random() * 1000000)::INTEGER as a,
    (random() * 5000000)::INTEGER as b,
    (random() * 10000000)::INTEGER as c
FROM
    generate_series(1, 10000000) AS t;

์ ๋‹นํžˆ 1000๋งŒ๊ฐœ ์ •๋„์˜ ๊ฐ’๋งŒ ๋žœ๋ค์œผ๋กœ ๊น”์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์ ๋‹นํžˆ ๋งŒ๋“ค์—ˆ๋‹ค.

 create index bloom_test on benchmark USING bloom (a, b, c);

์ด๋Ÿฌ๋ฉด a, b, c ์ปฌ๋Ÿผ์„ ์ „๋ถ€ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋œ๋‹ค.
์ˆœ์„œ๋Š” ์ƒ๊ด€์—†์–ด์„œ a ์กฐ๊ฑด ์—†์ด b๋งŒ ๊ฑธ์–ด๋„ ์ธ๋ฑ์Šค๋ฅผ ํƒ„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๊ฐ€์žฅ ๋†’์€ c๋กœ ์กฐ๊ฑด์„ ๊ฑธ๋ฉด, ์ธ๋ฑ์Šค๋ฅผ ํƒ„๋‹ค. ๋น ๋ฅด์ง„ ์•Š์ง€๋งŒ.

BTree๋กœ ๊ฑธ๋ฉด bloom๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋‚ฎ๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์ด ๋งŽ์€ a, b ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์กฐ๊ฑด์€, ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํƒ€์ง€ ์•Š๋Š”๋‹ค.

ํ†ต๊ณ„๋ฅผ ๋ณด๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์„ฑ๋Šฅ๋งŒ ๋ณด๋ฉด ์ข€ ์• ๋งคํ•˜๊ธด ํ•œ๋ฐ, ๊ทธ๋ž˜๋„ ํฌ๊ธฐ ์ž์ฒด๋Š” ์ž‘์€ ํŽธ์ด๋‹ค.

์ €๊ฒƒ๊ณผ ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ๋‚ด๋ ค๋ฉด Btree์—์„œ๋Š” ์ปฌ๋Ÿผ๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ์ด ๊ฒฝ์šฐ์—๋Š” ์ธ๋ฑ์Šค๋งŒ 700M์ฏค ๋จน๋Š”๋‹ค.
๋ฐ˜๋ฉด bloom ์ธ๋ฑ์Šค๋Š” ๊ทธ ์ ˆ๋ฐ˜๋„ ์•ˆ๋˜๋Š” 300M๋ฅผ ๋จน๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.



์ฐธ์กฐ
https://www.postgresql.org/docs/current/bloom.html