[DB] ๐Ÿ—‚๏ธ Index๋ž€?

Sangho Hanยท2025๋…„ 5์›” 21์ผ
3

๐Ÿงฑ DB

๋ชฉ๋ก ๋ณด๊ธฐ
1/4
post-thumbnail

๐Ÿ—‚๏ธ DB Index๋ž€?

์ธ๋ฑ์Šค๋Š” ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋”์šฑ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰(์กฐํšŒ)ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค.

Index๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž.
์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์—์„œ๋Š”, Full Table Scan ์„ ํ•ด์•ผ ํ•œ๋‹ค.


๐Ÿ” Full Table Scan

Full Table Scan์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  row๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ

SELECT * FROM users WHERE age = 20;

2. ์ธ๋ฑ์Šค๋ฅผ ํƒ€์ง€ ์•Š๋Š” ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

SELECT * FROM users WHERE YEAR(birthdate) = 2000;
  • birthdate์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋”๋ผ๋„, YEAR() ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๋ฉด ์ธ๋ฑ์Šค๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
SELECT * FROM users WHERE name LIKE '%sangho%';
  • LIKE ๋ฌธ ์•ž์— %๊ฐ€ ๋ถ™๋Š” ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ฐ˜๋ฉด, sangho%์™€ ๊ฐ™์ด ๋’ค์— ๋ถ™๋Š” ๊ฒฝ์šฐ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ด๋Š” ์ธ๋ฑ์Šค์˜ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ B-Tree์ด๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ํ•ด๋‹น ๋‚ด์šฉ์€ ์•„๋ž˜์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•  ์˜ˆ์ •์ด๋‹ค.

3. ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฝ์šฐ

SELECT * FROM users WHERE age > 5;
  • ๋‹ค์‹œ ๋งํ•ด, ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋”๋ผ๋„ ๊ตณ์ด ์ธ๋ฑ์Šค๋ฅผ ํƒˆ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
  • ํ…Œ์ด๋ธ”์— 1์‚ด๋ถ€ํ„ฐ 100์‚ด๊นŒ์ง€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด 100๊ฐœ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ์œ„ ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด 95๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋  ๊ฒƒ์ด๋‹ค.
  • 95% ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฑ์Šค๋ฅผ ํƒ€๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จ์ด ๋˜์–ด ํƒ€์ง€ ์•Š๋Š”๋‹ค.

    ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์ฆ‰, ์ธ๋ฑ์Šค๊ฐ€ ํ•ญ์ƒ ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ดํ›„ ๋ชฉ์ฐจ์—์„œ ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค.

  • ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ํŒ๋‹จ์€ ๋ˆ„๊ฐ€, ์–ธ์ œ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

DB ์˜ตํ‹ฐ๋งˆ์ด์ €(Query Optimizer)

  • DB ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” SQL ์‹คํ–‰ ์ „์— ์—ฌ๋Ÿฌ ์‹คํ–‰ ๊ณ„ํš ํ›„๋ณด๋“ค์„ ๋งŒ๋“  ํ›„, ๊ทธ ์•ˆ์—์„œ ๊ฐ€์žฅ cost๊ฐ€ ์ ์€ ๊ณ„ํš์„ ํƒํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค.
  • ์‹คํ–‰ ๊ณ„ํš ํ›„๋ณด๋“ค์˜ cost๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ๋Š” ์•„๋ž˜์˜ ์š”์†Œ๋“ค์„ ๊ณ ๋ คํ•œ๋‹ค.
๊ณ ๋ ค ํ•ญ๋ชฉ์„ค๋ช…
ํ†ต๊ณ„ ์ •๋ณด (Statistics)- ํ…Œ์ด๋ธ” ์ „์ฒด row ์ˆ˜
- ์ปฌ๋Ÿผ๋ณ„ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ
- NULL/์ค‘๋ณต ์—ฌ๋ถ€
- ์ธ๋ฑ์Šค selectivity ๋“ฑ
์ธ๋ฑ์Šค ์œ ๋ฌด- ์ธ๋ฑ์Šค ์กด์žฌ ์—ฌ๋ถ€
- ๋‹จ์ผ ์ธ๋ฑ์Šค vs ๋ณตํ•ฉ ์ธ๋ฑ์Šค
- Covering Index ์—ฌ๋ถ€
์กฐ๊ฑด์ ˆ ํ˜•ํƒœ- WHERE ์กฐ๊ฑด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž ์ข…๋ฅ˜
(LIKE, BETWEEN, =, <, != ๋“ฑ)
์กฐ์ธ ๋ฐฉ์‹- Nested Loop Join
- Hash Join
- Merge Join ๋“ฑ ๋‹ค์–‘ํ•œ ์กฐ์ธ ์ „๋žต ๋น„๊ต
ํ•„์š”ํ•œ ์ž‘์—…- ORDER BY, GROUP BY, ์ง‘๊ณ„ ํ•จ์ˆ˜ ๋“ฑ ๋ถ€๊ฐ€ ์—ฐ์‚ฐ ์—ฌ๋ถ€
- ์„œ๋ธŒ์ฟผ๋ฆฌ ํฌํ•จ ์—ฌ๋ถ€
๋””์Šคํฌ ์ ‘๊ทผ๋Ÿ‰- ์ „์ฒด ํ…Œ์ด๋ธ” vs ์ธ๋ฑ์Šค ํƒ์ƒ‰ ์‹œ I/O ๋น„์šฉ ์ฐจ์ด
- Random Access vs Sequential Access

์—ฌ๊ธฐ์„œ ํ†ต๊ณ„ ์ •๋ณด - ์ธ๋ฑ์Šค selectivity๋Š” ๋ฌด์—‡์ผ๊นŒ?

Index Selectivity

  • ์ด๋Š” ์ธ๋ฑ์Šค์˜ ํšจ์œจ์„ฑ์„ ํŒ๋‹จํ•˜๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์œผ๋กœ, ํŠน์ • ์กฐ๊ฑด์ด ์ „์ฒด row ์ค‘ ์–ผ๋งˆ๋‚˜ ์ ์€ row๋ฅผ ์„ ํƒํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜์น˜์ด๋‹ค.
์กฐ๊ฑด์ „์ฒด row ์ˆ˜์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” row ์ˆ˜selectivityํšจ์œจ์„ฑ
WHERE gender = 'M'1,000,000500,0000.5โŒ ๋‚ฎ์€ ํšจ์œจ
WHERE email = 'abc@example.com'1,000,00010.000001โœ… ๋งค์šฐ ํšจ์œจ์ 
  • ์œ„์™€ ๊ฐ™์ด selectivity ์ˆ˜์น˜๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ๋”์šฑ ๋†’์€ ์„ ํƒ๋„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฃผ๋กœ ๊ณ ์œ ๊ฐ’์ด ๋งŽ์€ ์ปฌ๋Ÿผ(ex. id, email ๋“ฑ)์ผ์ˆ˜๋ก ๋†’์€ ์„ ํƒ๋„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” ์นด๋””๋„๋ฆฌํ‹ฐ์™€ ์œ ์‚ฌํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค.(์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋” ์ƒ์œ„ ๊ฐœ๋…)

Full Table Scan์˜ ๋‹จ์ 

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹จ์ ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1. Full Table Scan์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌด์กฐ๊ฑด ์ฝ๋Š”๋‹ค

  • ์กฐ๊ฑด์— ๋งž๋Š” row๊ฐ€ 10๊ฑด๋งŒ ์žˆ์–ด๋„, ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด 100๋งŒ row ์ „์ฒด๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค.
  • ๋ฐ˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด, ๋”ฑ 10๊ฑด๋งŒ ์ฐพ์•„์„œ ๋ฐ”๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

2. ๋””์Šคํฌ I/O ๋น„์šฉ ์ฐจ์ด๊ฐ€ ํฌ๋‹ค

  • ์ธ๋ฑ์Šค ํƒ์ƒ‰์€ ํ•„์š”ํ•œ ๋ธ”๋ก๋งŒ ์ ‘๊ทผ (๋žœ๋ค ์•ก์„ธ์Šค, ์ ์€ ์–‘)
  • Full Scan์€ ๋ชจ๋“  ๋ธ”๋ก ์ˆœ์ฐจ ์ ‘๊ทผ (์‹œํ€€์…œ, ๋งŽ๊ณ  ๋ฌด๊ฑฐ์›€)

๐Ÿงฑ Index์˜ ์ž๋ฃŒ๊ตฌ์กฐ

๊ทธ๋ ‡๋‹ค๋ฉด Index๋Š” ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ผ๊นŒ? ์ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ธ๋ฑ์Šค ์ข…๋ฅ˜์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ฃผ์š” ์šฉ๋„ / ํŠน์ง•์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—”์ง„
PRIMARY / INDEX / UNIQUEB+Tree์ผ๋ฐ˜ ์กฐํšŒ, ๋ฒ”์œ„ ๊ฒ€์ƒ‰, ์ •๋ ฌ ๋“ฑ ๋‹ค์šฉ๋„InnoDB (๊ธฐ๋ณธ)
FULLTEXTInverted Index (์—ญ์ƒ‰์ธ)์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ (MATCH ...)InnoDB
SPATIALR-Tree๊ณต๊ฐ„ ์ขŒํ‘œ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ (GIS ๋“ฑ)InnoDB
HASHHash Table๋น ๋ฅธ ๋™๋“ฑ ๋น„๊ต (=) ๊ฒ€์ƒ‰ ์ „์šฉMEMORY

์œ„์™€ ๊ฐ™์ด MySQL Index๋Š” 4์ข…๋ฅ˜์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” B+Tree์— ๋Œ€ํ•ด์„œ๋งŒ ๋‹ค๋ฃจ๊ณ ์ž ํ•œ๋‹ค.

B+Tree

์ด๋ฏธ์ง€ ์ถœ์ฒ˜

B+Tree๋Š” B-Tree์˜ ํ™•์žฅ ๊ฐœ๋…์œผ๋กœ, ํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ ์ตœ๋Œ€ํ•œ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•˜๋ฉฐ ํƒ์ƒ‰์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

B-Tree & B+Tree๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ฐจ์ด์ ์€ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€๋Š” ํ•ด๋‹น ๊ธ€์— ์ •๋ฆฌํ•ด ๋‘์—ˆ๋‹ค.


๐Ÿ”€ Index ๋™์ž‘ ๊ณผ์ •

์ง€๊ธˆ๊นŒ์ง€ ์ธ๋ฑ์Šค๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋– ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€๊นŒ์ง€ ์•Œ์•„๋ณด์•˜๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋– ํ•œ ๋™์ž‘ ๊ณผ์ •์œผ๋กœ ์›ํ•˜๋Š” ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ์•„์ง ๊ฐ์ด ์ž˜ ์˜ค์ง€ ์•Š๋Š”๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์œ„ ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด์„œ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ด๋ฏธ์ง€ ์ถœ์ฒ˜

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ˜„์žฌ๋Š” company_id์ด๋‹ค.
  2. ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ๊ฐ’๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ B+Tree ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ์ธ๋ฑ์Šค๋Š” ๋””์Šคํฌ ์ƒ ๋ณ„๋„์˜ ์ €์žฅ ๊ตฌ์กฐ๋กœ ์œ ์ง€๋œ๋‹ค.
  3. ์‚ฌ์šฉ์ž๊ฐ€ company_id = 18์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ธ๋‹ค.
  4. DB๋Š” ๋จผ์ € ์ธ๋ฑ์Šค(B+Tree)๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ 18์ด๋ผ๋Š” ํ‚ค ๊ฐ’์„ ๊ฐ€์ง„ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ ๋ชฉ๋ก์„ ์ฐพ์•„๋‚ธ๋‹ค.
  5. ์ด ํฌ์ธํ„ฐ๋Š” ์‹ค์ œ ํ…Œ์ด๋ธ”์˜ row ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, DB๋Š” ํ•ด๋‹น ์œ„์น˜๋กœ ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ row ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.

์—ฌ๊ธฐ์„œ ์•„๋ž˜์˜ ๊ถ๊ธˆ์ฆ๋“ค์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

1. ์ธ๋ฑ์Šค๋Š” ์–ด๋””์— ์ €์žฅ๋˜๋Š”๊ฐ€?

MySQL InnoDB ๊ธฐ์ค€์œผ๋กœ, ์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ(.ibd) ํŒŒ์ผ ๋‚ด๋ถ€์— ํ•จ๊ป˜ ์ €์žฅ๋œ๋‹ค.

ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด, ๋ณดํ†ต ~.ibd๋ผ๋Š” ํŒŒ์ผ์ด ํ•จ๊ป˜ ์ƒ๊ธฐ๊ฒŒ ๋˜๋Š”๋ฐ, ์ธ๋ฑ์Šค ๊ตฌ์กฐ(B+Tree)๋Š” ๋‚ด๋ถ€ ํŽ˜์ด์ง€ ๋‹จ์œ„ ๊ตฌ์กฐ์— ํ•จ๊ป˜ ์ €์žฅ์ด ๋œ๋‹ค. (ํŽ˜์ด์ง€ ๋‹จ์œ„์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„ ๋”ฐ๋กœ ๋‹ค๋ฃจ์–ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค)

๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด .ibd ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

2. ์ธ๋ฑ์Šค๋Š” ์ €์žฅ ๊ณต๊ฐ„์„ ์–ผ๋งˆ๋‚˜ ์ฐจ์ง€ํ•˜๋Š”๊ฐ€?

์ €์žฅ ๊ณต๊ฐ„์„ ์–ผ๋งˆ๋‚˜ ์ฐจ์ง€ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ •ํ™•ํžˆ ๊ณต์‹์ฒ˜๋Ÿผ ๊ณ„์‚ฐํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์š”์†Œ๋“ค์— ์˜ํ•ด์„œ ๋ณ€๋™์„ฑ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  1. ์ธ๋ฑ์Šค ํ‚ค์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…
  2. ์ธ๋ฑ์‹ฑ ๋Œ€์ƒ row ์ˆ˜ (์ธ๋ฑ์Šค๋Š” row ์ˆ˜๋งŒํผ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค)
  3. ์ธ๋ฑ์Šค ํƒ€์ž…
  4. InnoDB ์„ค์ • (ํŽ˜์ด์ง€ ํฌ๊ธฐ ๋“ฑ)

์‹ค์ œ๋กœ ํ™•์ธํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

SHOW TABLE STATUS LIKE {ํ…Œ์ด๋ธ”๋ช…};

์—ฌ๊ธฐ์„œ Index_length ์ปฌ๋Ÿผ์ด, ์ธ๋ฑ์Šค๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋””์Šคํฌ ์šฉ๋Ÿ‰(byte)์ด ๋œ๋‹ค.

3. ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ์ด ํ•˜๋‚˜ ์ถ”๊ฐ€๋˜๋Š”๊ฐ€?

๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ์— ์ปฌ๋Ÿผ์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์ด ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋กœ ๋‚จ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๐Ÿšจ Index์˜ ํ•œ๊ณ„

์ง€๊ธˆ๊นŒ์ง€๋Š” ์ธ๋ฑ์Šค์˜ ์ข‹์€ ์ ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ๋‚˜์—ดํ–ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“  ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์กฐํšŒ ์†๋„๊ฐ€ ๋งค์šฐ ๋นจ๋ผ์ง€์ง€ ์•Š์„๊นŒ?

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์—ฌ๋Ÿฌ ํ•œ๊ณ„์ ๋“ค๋„ ์กด์žฌํ•œ๋‹ค.

1. ์ถ”๊ฐ€์ ์ธ ์ €์žฅ ๊ณต๊ฐ„ ์‚ฌ์šฉ

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด .ibd ํŒŒ์ผ ๋‚ด๋ถ€์— ๋ณ„๋„์˜ ์ธ๋ฑ์Šค ๊ตฌ์กฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
์ด๋Š” ์—ฌ๋Ÿฌ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ณดํ†ต ์ „์ฒด ํ…Œ์ด๋ธ” ํฌ๊ธฐ์˜ 5~25% ์ˆ˜์ค€์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

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

2. ๊ด€๋ฆฌ ๋น„์šฉ

์ธ๋ฑ์Šค๋Š” ์กฐํšŒ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐ ํŠนํ™”๋˜์–ด ์žˆ๋‹ค. ๋ฐ˜๋ฉด ์“ฐ๊ธฐ ์—ฐ์‚ฐ(INSERT, UPDATE, DELETE)์— ๋Œ€ํ•ด์„œ๋Š” ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ์“ฐ๊ธฐ ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ์ธ๋ฑ์Šค์—๋„ ๋™์ผํ•œ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋  ๋•Œ, ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ B+Tree ๊ตฌ์กฐ ์—ญ์‹œ ํ•จ๊ป˜ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ์ถ”๊ฐ€ ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

๋”ฐ๋ผ์„œ ์กฐํšŒ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋˜, ์“ฐ๊ธฐ ์„ฑ๋Šฅ๊ณผ์˜ Trade-Off๋ฅผ ๊ณ ๋ คํ•œ ์ธ๋ฑ์Šค ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.


โœ… Index ์ƒ์„ฑ ์ „๋žต

๋งˆ์ง€๋ง‰์œผ๋กœ ํšจ์œจ์ ์ธ ์ธ๋ฑ์Šค ์ƒ์„ฑ ์ „๋žต์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜๋ฉฐ ๋งˆ๋ฌด๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

1. WHERE, JOIN, ORDER BY์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ

ํ•ด๋‹น ์ปฌ๋Ÿผ์ด ์กฐ๊ฑด์ ˆ, ์ •๋ ฌ, ์กฐ์ธ ๊ธฐ์ค€์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ์ข‹๋‹ค. ํŠนํžˆ ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์—์„œ์˜ ์กฐ๊ฑด ๊ฒ€์ƒ‰์— ํšจ๊ณผ์ ์ด๋‹ค.

SELECT * FROM users WHERE email = 'abc@example.com';

2. ๋ฐ์ดํ„ฐ์˜ ์„ ํƒ๋„(Selectivity) ๊ฐ€ ๋†’์€ ์ปฌ๋Ÿผ

์ฆ‰, ๊ณ ์œ ๊ฐ’์ด ๋งŽ์€(=์นด๋””๋„๋ฆฌํ‹ฐ๊ฐ€ ๋†’์€) ์ปฌ๋Ÿผ์ผ์ˆ˜๋ก ์ธ๋ฑ์Šค ํšจ์œจ์ด ๋†’๋‹ค. (email, user_id ๋“ฑ..)

๋ฐ˜๋ฉด, gender, is_active(T or F ์ด๊ธฐ์—) ๊ฐ™์€ ์ปฌ๋Ÿผ์€ selectivity๊ฐ€ ๋‚ฎ๊ธฐ์— ๊ฑฐ์˜ ํšจ๊ณผ๊ฐ€ ์—†๋‹ค.

3. FK(์™ธ๋ž˜ ํ‚ค)๋กœ ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ์ปฌ๋Ÿผ

PK(Primary Key)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค.

ํ•˜์ง€๋งŒ FK๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—,
FK ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ WHERE ์กฐํšŒ๋‚˜ JOIN์ด ๋นˆ๋ฒˆํ•˜๋‹ค๋ฉด ์ˆ˜๋™์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ์–ด์•ผ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

4. UPDATE/DELETE๊ฐ€ ๋งŽ๋‹ค๋ฉด ์ตœ์†Œํ™” ๊ณ ๋ ค

์“ฐ๊ธฐ ์—ฐ์‚ฐ์ด ๋งŽ๊ณ , row๊ฐ€ ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ์ปฌ๋Ÿผ์—๋Š” ์ธ๋ฑ์Šค ์ƒ์„ฑ์„ ์ž์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํƒœ์— ๋”ฐ๋ผ ๊ฐ’์ด ์ž์ฃผ ๋ฐ”๋€Œ๋Š” status ์ปฌ๋Ÿผ ๋“ฑ์€ ๋ถˆํ•„์š”ํ•œ ์ธ๋ฑ์Šค ๊ฐฑ์‹  ๋ถ€๋‹ด์ด ํฌ๋‹ค.


profile
์•ˆ๋…•ํ•˜์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž, ํ•œ์ƒํ˜ธ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€