Contents

optimization index

Introduction

๋‹ค๋“ค ์ž˜ ์•Œ๊ณ  ์žˆ๋‹ค์‹ถ์ด, ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค. ์ธ๋ฑ์Šค๋Š” ํ•œ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ์ถ”๊ฐ€์ ์ธ ์กฐ์น˜๊ฐ€ ํ•„์š”์—†์ง€๋งŒ, ์ฟผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ๊ฐ€ ์ข‹์€ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋Œ๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ANALYZE ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํ†ต๊ณ„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

ํฐ ํ…Œ์ด๋ธ”์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์‹œ์Šคํ…œ์€ ํ…Œ์ด๋ธ”๊ณผ ์ธ๋ฑ์Šค๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๊ณผ์ •์—์„œ DB ์—”์ง„๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ, ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ž‘์—…์ด ๋Š๋ ค์งˆ ์ˆ˜ ๋„ ์žˆ๋‹ค.

Index Type

์ด ํฌ์ŠคํŒ…์€, postgres ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ด๋ผ ์•„๋ž˜์™€ ๊ฐ™์ด 5๊ฐœ์˜ ์ธ๋ฑ์Šค ํƒ€์ž…์„ ์„ค๋ช…ํ•œ๋‹ค. mysql ์˜ ๊ฒฝ์šฐ Gist / GIN / BRIN ์˜ index type์€ ์—†๊ณ  FULLTEXT / R-Tree ๊ฐ™์€ ๋ณ„๋„์˜ ์ธ๋ฑ์Šค ํƒ€์ž…์„ ์ง€์›ํ•œ๋‹ค.

B-Tree

B-tree๋Š” ํŠน์ • ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„ ์ฑ„๋กœ ์ €์žฅ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋™๋“ฑ๋น„๊ต๋‚˜ ๋ฒ”์œ„์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ํšจ๊ณผ์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. LIKE / ~ ๊ฐ™์€ ์—ฐ์‚ฐ์ž์™€๋„ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ˆ์™ธ์‚ฌํ•ญ์ด ์กด์žฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด column like 'foo%' column ~ '^foo' ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, column like '%bar'๋Š” ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค.

Hash

ํ•ด์‰ฌ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•ด์‰ฌ ํ•จ์ˆ˜๋Š” ์ž„์˜์˜ ๊ธธ์ด์˜ ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ๊ณ ์ •๋œ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ถœ๋ ฅ๋˜๋Š” ๊ฐ’์„ hash code ๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ด ๊ฐ’์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

ํ•ด์‰ฌ ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ํ‰๊ท  ์กฐํšŒ์‹œ๊ฐ„์€ O(1)์ด๊ณ , ๊ณต๊ฐ„๋„ ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ์ฟผ๋ฆฌ์— ๋”ฐ๋ผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ณ„๋„์˜ ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.(b-tree ์ธ๋ฑ์Šค์— ๋น„ํ•ด ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋Š” ์ž‘์€ ํŽธ์ด๋‹ค.) ํ•ด์‰ฌ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์—ฐ์‚ฐ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋ฒ”์œ„ ์ฟผ๋ฆฌ์—๋Š” ํšจ๊ณผ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

mysql์˜ innodb ์—”์ง„์—์„œ global innodb_adaptive_hash_index ์˜ต์…˜์„ ์ผœ์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ํ•ด์‰ฌ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ ํ•ด์‰ฌ ์ž๋ฃŒ๊ตฌ์กฐ์— ๊ณ„์† ์Œ“์—ฌ๊ฐ€๋Š” ํ•ด์‰ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ํ…Œ์ด๋ธ” drop ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

Gist(postgres)

// todo desc

GIN(postgres)

// todo desc

BRIN(postgres)

// todo desc

FULLTEXT(mysql)

// todo desc

R-Tree(mysql)

// todo desc

MultiColumn Index

multicolumn index๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์„ ํ–‰๋˜๋Š” ์ปฌ๋Ÿผ์˜ ๋™๋“ฑ ๋น„๊ต