software engineering/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์„ค๊ณ„

[DB] ์ธ๋ฑ์Šค (Index)

jjingle 2023. 10. 11. 10:42

1.  ์ธ๋ฑ์Šค ๊ฐœ์š”

  • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ์  ํฌ์ธํ„ฐ์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ฑ…์˜ ์ฐพ์•„๋ณด๊ธฐ์™€ ๊ฐ™์€ ์—ญํ• 
  • ํ…Œ์ด๋ธ” ๋กœ์šฐ์˜ ํŠน์ •๊ฐ’(ROWID)๊ณผ ํŠน์ • ์ปฌ๋Ÿผ์˜ ์ •๋ ฌ๋œ ๊ฐ’์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌ์กฐํ™”
  • ์งˆ์˜๋ฌธ์˜ ๋น ๋ฅธ ์ˆ˜ํ–‰๊ณผ ์ปฌ๋Ÿผ๊ฐ’์˜ ์œ ์ผ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ

 

* ์ธ๋ฑ์Šค์˜ ํ•„์š”์„ฑ

  • ํ…Œ์ด๋ธ” ๋กœ์šฐ๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋ธ”๋ก์˜ ๋นˆ ๊ณต๊ฐ„์— ์ €์žฅ๋จ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ฐ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ ์›ํ•˜๋Š” ๋กœ์šฐ๋ฅผ ์ฐพ์•„์•ผํ•จ
  • ์ž‘์€ ํฌ๊ธฐ์˜ ํ…Œ์ด๋ธ”์€ ์—†์–ด๋„ ๋ฌด๊ด€
  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์†๋„๊ฐ€ ๋นจ๋ผ์ง

 

* ์ธ๋ฑ์Šค์˜ ์žฅ๋‹จ์ 

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

 

 

* ์ธ๋ฑ์Šค ์ƒ์„ฑ ๊ธฐ์ค€

  • ์ƒ์„ฑ O
    • SQL๋ฌธ์—์„œ ์ปฌ๋Ÿผ์ด WHERE์ ˆ ๋˜๋Š” JOIN ์กฐ๊ฑด์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋  ๋•Œ
    • ์ปฌ๋Ÿผ์— ๊ด‘๋ฒ”์œ„ํ•œ ๊ฐ’์ด ํฌํ•จ๋  ๋•Œ(๋ฒ”์œ„ ๊ฒ€์ƒ‰)
    • ์ปฌ๋Ÿผ์— ๋งŽ์€ ์ˆ˜์˜ NULL ๊ฐ’์ด ํฌํ•จ๋  ๋•Œ
    • ๋Œ€ํ˜• ํ…Œ์ด๋ธ”์ด๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์งˆ์˜๊ฐ€ 10~15% ์ดํ•˜๋กœ ๋กœ์šฐ๋ฅผ ์ฝ์–ด๋“ค์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•  ๋•Œ
  • ์ƒ์„ฑ X
    • ํ…Œ์ด๋ธ”์— ์ž๋ฃŒ์˜ ์–‘์ด ์ ์„ ๋•Œ
    • ์ปฌ๋Ÿผ์ด WHERE ์กฐ๊ฑด์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ
    • ์งˆ์˜ ๋Œ€๋ถ€๋ถ„์ด 10~15% ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋  ๋•Œ
    • ํ…Œ์ด๋ธ”์— ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ์ผ์–ด๋‚  ๋•Œ

 

 

* ์ธ๋ฑ์Šค์˜ ์ข…๋ฅ˜

(๋…ผ๋ฆฌ์  ๋ถ„๋ฅ˜)

  • ๋‹จ์ผ ์ปฌ๋Ÿผ ์ธ๋ฑ์Šค : ํ•˜๋‚˜์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑ
  • ๋ณตํ•ฉ ์ธ๋ฑ์Šค : ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑ (32๊ฐœ๊นŒ์ง€ ๊ฐ€๋Šฅ)
  • ์œ ์ผ ์ธ๋ฑ์Šค : ์ค‘๋ณต๋œ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค
  • ๋น„์œ ์ผ ์ธ๋ฑ์Šค : ์ค‘๋ณต๋œ ๊ฐ’์ด ํ—ˆ์šฉ๋˜๋Š” ์ธ๋ฑ์Šค
  • ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šคํ•จ์ˆ˜๋‚˜ ํ‘œํ˜„์‹์œผ๋กœ ์ปฌ๋Ÿผ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ธ๋ฑ์Šค์— ์ €์žฅ

(๋ฌผ๋ฆฌ์  ๋ถ„๋ฅ˜)

  • ์—ญ๋ฐฉํ–ฅ ์ธ๋ฑ์Šค
    • B-Tree ์ธ๋ฑ์Šค์—์„œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๋’ค์ง‘์–ด์„œ ๋ฐฐ์—ด
    • ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๋ฉด, ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์น˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๊ณ  ๊ท ํ˜•์ด ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
  • ๋น„ํŠธ๋งต ์ธ๋ฑ์Šค : ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ €์žฅ
  • ๋น„ํŠธ๋งต-์กฐ์ธ ์ธ๋ฑ์Šค
    • ๊ธฐ๋ณธ ๊ตฌ์กฐ๋Š” ๋น„ํŠธ๋งต ์ธ๋ฑ์Šค์™€ ๋™์ผ 
    • ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ” ์กฐ์ธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์ •์˜๋˜์–ด ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค
  • ์œ ์ผ ์ธ๋ฑ์Šค์ค‘๋ณต๋œ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค

2. ์ธ๋ฑ์Šค ๊ตฌ์กฐ์™€ ์ž‘๋™์›๋ฆฌ

* B-Tree (Balanced Tree, ๊ท ํ˜•ํŠธ๋ฆฌ)

  • ๊ท ํ˜•ํŠธ๋ฆฌ๋Š” ์–‘์ชฝ ๋…ธ๋“œ์˜ ๋†’์ด ์ฐจ๊ฐ€ 1 ์ดํ•˜์ธ ํŠธ๋ฆฌ๋กœ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ๊ณ ์ž ํ•  ๋•Œ, ์ผ์ •ํ•œ ์„ฑ๋Šฅ์„ ๋ณด์žฅ
  • ๋Œ€๋ถ€๋ถ„์˜ DBMS๋Š” B-Tree ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ํ‘œํ˜„
  • ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์ƒ‰(SELECT)์‹œ์— ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ
  • ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ(INSERT, UPDATE, DELETE)์‹œ์— ์„ฑ๋Šฅ ์ €ํ•˜

 

* ์ธ๋ฑ์Šค ๊ตฌ์„ฑ

  • ๋ฆฌํ”„ ๋ธ”๋ก์€ ํ•ญ์ƒ ์ธ๋ฑ์Šค ํ‚ค(Key) ๊ฐ’ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฒ”์œ„ ์Šค์บ”(Range Scan, ๊ฒ€์ƒ‰ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ฒ”์œ„๋งŒ ์ฝ๋‹ค๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒƒ)์ด ๊ฐ€๋Šฅ
  • ์ •๋ฐฉํ–ฅ๊ณผ ์—ญ๋ฐฉํ–ฅ ์Šค์บ”์ด ๋‘˜ ๋‹ค ๊ฐ€๋Šฅํ•˜๋„๋ก ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Double linked list) ๊ตฌ์กฐ๋กœ ์—ฐ๊ฒฐ๋จ

 

* ์ธ๋ฑ์Šค ์Šค์บ” (Index  Scan)

  1. Index Range Scan
    • ์ธ๋ฑ์Šค ๋ฃจํŠธ ๋ธ”๋ก์—์„œ ๋ฆฌํ”„ ๋ธ”๋ก๊นŒ์ง€ ์ˆ˜์ง์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ ํ›„, ๋ฆฌํ”„ ๋ธ”๋ก์„ ํ•„์š”ํ•œ ๋ฒ”์œ„(Range)๋งŒ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹
    • B-Tree ์ธ๋ฑ์Šค์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ์ •์ƒ์ ์ธ ํ˜•ํƒœ์˜ ์•ก์„ธ์Šค ๋ฐฉ์‹
  2. Index Unique Scan
    • ์ˆ˜์ง์  ํƒ์ƒ‰๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ์Šค์บ” ๋ฐฉ์‹์œผ๋กœ์„œ, Unique ์ธ๋ฑ์Šค๋ฅผ '=' ์กฐ๊ฑด์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ž‘๋™
    • ์ผ์น˜ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์€ ๊ฒฝ์šฐ ๋ฐ”๋กœ ๋ฉˆ์ถค
  3. Index Full Scan
    • ์ˆ˜์ง์  ํƒ์ƒ‰์—†์ด ์ธ๋ฑ์Šค ๋ฆฌํ”„ ๋ธ”๋ก์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ˆ˜ํ‰์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹
    • ๋Œ€๊ฐœ๋Š” ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ตœ์ ์˜ ์ธ๋ฑ์Šค๊ฐ€ ์—†์„ ๋•Œ ์ฐจ์„ ์œผ๋กœ ์„ ํƒ
    • ์ธ๋ฑ์Šค ์„ ๋‘ ์ปฌ๋Ÿผ์ด ์กฐ๊ฑด์ ˆ์— ์—†์œผ๋ฉด ์šฐ์„ ์ ์œผ๋กœ Table Full Scan์„ ๊ณ ๋ ค (๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ” X)
    • ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ™œ์šฉ
      • ORDER BY์ ˆ์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ
      • GROUP BY์ ˆ์˜ ์ปฌ๋Ÿผ์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ
      • ์ธ๋ฑ์Šค ์Šค์บ” ๋‹จ๊ณ„์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋กœ์šฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ , ์ผ๋ถ€์— ๋Œ€ํ•ด์„œ๋งŒ ํ…Œ์ด๋ธ” ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จ๋  ๋•Œ
  4. Index Skip Scan
    • ๋ฃจํŠธ ๋˜๋Š” ๋ธŒ๋žœ์น˜ ๋ธ”๋ก์—์„œ ์ฝ์€ ์นผ๋Ÿผ ๊ฐ’ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด, ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•  '๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”' ํ•˜์œ„ ๋ธ”๋ก๋งŒ ๊ณจ๋ผ์„œ ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ์‹
    • ์กฐ๊ฑด์ ˆ์— ๋น ์ง„ ์ธ๋ฑ์Šค ์„ ๋‘ ์นผ๋Ÿผ์˜ Distinct Value ๊ฐœ์ˆ˜๊ฐ€ ์ ๊ณ , ํ›„ํ–‰ ์นผ๋Ÿผ์˜ Distinct Value ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ
  5. Index Fast Full Scan : ์ธ๋ฑ์Šค ํŠธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ๋ฌด์‹œํ•˜๊ณ , ์ธ๋ฑ์Šค ์„ธ๊ทธ๋จผํŠธ ์ „์ฒด๋ฅผ ๋ฉ€ํ‹ฐ๋ธ”๋ก ์ฝ๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์Šค์บ”
  Index Full Scan Index Fast Full Scan
  - ์ธ๋ฑ์Šค ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ ์Šค์บ” - ์„ธ๊ทธ๋จผํŠธ(์ธ๋ฑ์Šค) ์ „์ฒด๋ฅผ ์Šค์บ”
  - ๊ฒฐ๊ณผ์ง‘ํ•ฉ ์ˆœ์„œ ๋ณด์žฅ - ๊ฒฐ๊ณผ์ง‘ํ•ฉ ์ˆœ์„œ ๋ณด์žฅ X
  - Single Block I/O - Multiblock I/O
  - ๋ณ‘๋ ฌ์Šค์บ” ๋ถˆ๊ฐ€ - ๋ณ‘๋ ฌ์Šค์บ” ๊ฐ€๋Šฅ
  - ์ธ๋ฑ์Šค์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์ปฌ๋Ÿผ ์กฐํšŒ ์‹œ์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
- ์ธ๋ฑ์Šค์— ํฌํ•จ๋œ ์ปฌ๋Ÿผ์œผ๋กœ๋งŒ ์กฐํšŒํ•  ๋•Œ, ์‚ฌ์šฉ ๊ฐ€๋Šฅ