[PostgreSQL] ์ธ๋ฑ์ค: Gin
postgres์ ์ธ๋ฑ์ค ํ์
์๋ btree, ํด์ ์ธ์๋ ๋
ํนํ 2๊ฐ์ง ํ์
์ด ์กด์ฌํ๋ค.
๋ฐ๋ก Gist์ Gin์ด๋ค.
์ฌ๊ธฐ์ ์ฌ์ฉ์ฑ์ด ์ข๋ ๊ด์ฐฎ์ Gin์ ๋จผ์ ๋ค๋ค๋ณด๊ฒ ๋ค.
์ฐ์ ํ ์คํธํ ํ ์ด๋ธ ์ํ๋ ์ด๋ ๋ค.
๋ณ๊ฑฐ์๋ค. ๊ฐ์ 10๋ง๊ฐ๋ง ๋ฃ์ด๋๋ค.
Gin์ด๋?
Gin์ Generalized Inverted Index์ ์ถ์ฝ์ผ๋ก, ๋ฒ์ญํ๋ฉด "์ผ๋ฐํ๋ ๊ฐ๊ฒฉ ์ธ๋ฑ์ค"๊ฐ ๋๋ค.
๋ง ๊ทธ๋๋ก ๊ฐ(ํนํ ๋ฌธ์์ด)์ ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ์ชผ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ณต์กํ ์กฐ๊ฑด์์๋ ํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ฌ์ค Gin์ด๋ Gist๊ฐ์ ํน์ํ ์ธ๋ฑ์ค๋ค์ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ก๋ ์ ํฉํ์ง ์์ ์น๊ตฌ๋ค์ด๋ค. ๋ง ๋ฐฐ์ด์ฒ๋ฆฌ๋ ๋ณต์กํ ์ปค์คํ
์ด ํ์ํ ๋ ์ฃผ๋ก ์ฐ๋๋ฐ,
Gin์ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ์ผ์ด์ค๊ฐ ํ๋ ์๋ค.
๋ฐ๋ก ํ ์คํธ ํจํด๊ฒ์์ด๋ค.
์์ ์ธ๊ธํ๋ฏ์ด, ์ผ๋ฐ ์ธ๋ฑ์ค์ ๊ฒฝ์ฐ์๋ LIKE '%ํ ์คํธ%' ๊ฐ์ ์กฐ๊ฑด์๋ ์ธ๋ฑ์ค ์ค์บ์ ํ์ง ๋ชปํ๋ค. text_pattern_ops๋ผ๋ ํด๋์ค๋ฅผ ์ง์ ํด๋ %๊ฐ ํจํด ์์ ๋ถ์ ๊ฒ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค.
ํ์ง๋ง Gin ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฐ ์ํฉ์์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ธ ์๊ฐ ์๋ค.
๋ํ, Gin์ ์ผ๋ฐ ์ธ๋ฑ์ค์ฒ๋ผ ๊ทธ๋ฅ ๋ฌ ์ ์๋ ๊ฒ ์๋๋ผ ์ฐ์ฐ์ ํด๋์ค๋ผ๋ ๊ฒ์ ์ง์ ํด์ค์ผ ํ๋ค.
Gin์ ์ฌ์ฉํ ๋งํ ๋ด์ฅ ํด๋์ค๋ array_ops, tsvector_ops, jsonb_ops, jsonb_path_ops ๋ฑ์ด ์์ผ๋, ์ด๊ฒ๋ค์ ๋ฌธ์์ด์ ์ฐ๊ธฐ ํ๋ ๊ฒ๋ค์ด๊ณ .
๋ฌธ์์ด ๊ฒ์์๋ pg_trgm์ด๋ผ๋ ํ์ฅ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐํธํ๊ณ ๊ด์ฐฎ์ ํธ์ด๋ค. ์ด๊ฑด ๋ฌธ์์ด์ 3๊ธ์์ฉ ์ชผ๊ฐ์ ์ฒ๋ฆฌํ๋ค๊ณ ํ๋ค.
pg_trgm์ ์ด์ฉํ ๊ฒ์
์์ฑ์ ์๋์ ๊ฐ์ด ํ๋ฉด ๋๋ค.
create extension์ผ๋ก ๋จผ์ pg_trgm ํ์ฅ์ ํ์ฑํํ๊ณ , ์ธ๋ฑ์ค ์์ฑ์์ ์ฐ์ฐ์ ํด๋์ค gin_trgm_ops๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.

๊ทธ๋ผ
ํ์ค์บ์ ํด์ 9์ด๊ฐ ๋๊ฒ ๊ฑธ๋ฆฌ๋ ๊ฒ์ด
์ธ๋ฑ์ค๋ฅผ ํ ๋นํธ๋งต ์ค์บ์ผ๋ก 1์ด๋ ๊ฑธ๋ฆฌ์ง ์๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ์ฝ๊ฐ ์ฃผ์ํ ์ ์ด ์๋๋ฐ
pg_trgm์ 3๊ธ์ ๋จ์๋ก ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์, ์์ ๊ฐ์ด ๊ธ์๊ฐ 3๊ธ์ ๋ฏธ๋ง์ด๋ฉด ์ธ๋ฑ์ค๋ฅผ ํ์ง ๋ชปํ๋ค๋ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ์ฌ์ค 1๊ธ์๋ 2๊ธ์ ์ ๋์ ๊ฒ์ ํจํด์ ๊ฒ์๋ฒ์๊ฐ ๋๋ฌด ๋๊ธฐ ๋๋ฌธ์ ์คํ๋ ค ํ์ค์บ์ด ๋น ๋ฅผ ํ๋ฅ ์ด ๋๋ค.
๊ทธ๋์ ํฐ ๋ฌธ์ ๋ ์๋ค๊ณ ํ ์ ์๊ฒ ๋ค.
tsvector ํ์ ์ ์ด์ฉํ ์ ์ฒด ํ ์คํธ ๊ฒ์
tsvector์ ts๋ text search์ ์ถ์ฝ์ด๋ค. ๋ง ๊ทธ๋๋ก ํ
์คํธ ๊ฒ์์ ์ํ ๋ฒกํฐ๋ผ๋ ๋ง์ด๋ค.
์ค์ ์ฒ๋ฆฌ๋ฐฉ์์ด๋ ์ฌ์ฉ๋ฒ์ด ๋ค ๋ฌธ์์ด์ ๋ฐฐ์ด์ด๋ผ์ ๋จ์ํ ๋ฌธ์์ด๋ง ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ผ๋ฉด ๊ณผ๋ํ ์๋ ์๋ค...
์ด๊ฑด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธด ๋ฌธ์ฅ์์ 'ํน์ ๋จ์ด'๋ง์ ๊ฒ์ํ ๋ ์ ํฉํ ๋ฐฉ์์ด๋ค.



์ด๊ฑด like ๋์ @@ ์ฐ์ฐ์์ tsquery ๊ฐ์ผ๋ก ๊ฒ์์ ์ํํ๋ค.
์๋์ tsquery๋ 16์ผ๋ก ์์ํ๋ ํ
์คํธ๋ง ์ฐพ๋ ์ฟผ๋ฆฌ๋ค.
๊ทผ๋ฐ ํํ ์์ผ๋ ์นด๋๋ ๋๋๋ฐ ์ ํ ์์ผ๋์นด๋๋ ์ ์๋๋ ๊ฒ ๊ฐ๋ค?
์ด๊ฒ๋ gin ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด๋ณด์
์ด๊ฑด ์ฐ์ฐ์ ํด๋์ค๋ฅผ ๋ฐ๋ก ์ง์ ํด์ฃผ์ง ์์๋ ๋ง๋๋ ๊ฒ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ผ ๋นํธ๋งต์ด ์ ๋ฐ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค.
์ฐธ์กฐ
https://medium.com/vuno-sw-dev/postgresql-gin-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%A5%BC-%ED%86%B5%ED%95%9C-like-%EA%B2%80%EC%83%89-%EC%84%B1%EB%8A%A5-%EA%B0%9C%EC%84%A0-3c6b05c7e75f
https://stackoverflow.com/questions/1566717/postgresql-like-query-performance-variations
https://dba.stackexchange.com/questions/10694/pattern-matching-with-like-similar-to-or-regular-expressions-in-postgresql/10696#10696
https://www.postgresql.org/docs/9.5/textsearch.html