๐Ÿ“– CS/๐Ÿ“ฆ DB

[DB] ์ธ๋ฑ์Šค๋ž€? B+Tree ๊ตฌ์กฐ๋ถ€ํ„ฐ ์Šค์บ” ๋ฐฉ์‹๊นŒ์ง€ ์ •๋ฆฌ

carrot0911 2025. 7. 29. 16:04

๐Ÿ“Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์Šค๋ž€?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์Šค(Idex)๋Š” ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์ฑ…์˜ ์ƒ‰์ธ(index)์ฒ˜๋Ÿผ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋‹ค.
์ •๋ ฌ๋œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ ์„ฑ๋Šฅ์€ ๋›ฐ์–ด๋‚˜์ง€๋งŒ, INSERT, UPDATE, DELETE ์‹œ์—๋Š” ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
(์ •๋ ฌ ์œ ์ง€์™€ ์žฌ๊ตฌ์„ฑ ๋น„์šฉ ๋•Œ๋ฌธ)

 

 

โœ… ์ธ๋ฑ์Šค๋Š” ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„๋ ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDBMS)๋Š” B-Tree ๋˜๋Š” B+Tree ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
(MySQL์˜ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ•  ์˜ˆ์ •)

 

 

๐ŸŒณ B+Tree ์ธ๋ฑ์Šค ๊ตฌ์กฐ

  • B+Tree๋Š” B-Tree์˜ ๋ณ€ํ˜•์œผ๋กœ ๋ชจ๋“  ์‹ค์ œ ๋ฐ์ดํ„ฐ(๋ ˆ์ฝ”๋“œ ์œ„์น˜)๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ์—๋งŒ ์กด์žฌ
  • ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ ์œ ์ง€
    (→ ๋ฒ”์œ„ ์กฐํšŒ๊ฐ€ ๋น ๋ฅด๋‹ค, ์ˆœ์ฐจ ์ ‘๊ทผ์ด ์šฉ์ดํ•˜๋‹ค.)

๐Ÿ“ฆ ๊ตฌ์กฐ ๊ตฌ์„ฑ

  1. ๋ฃจํŠธ ๋…ธ๋“œ(Root Node) : ์ตœ์ƒ์œ„ ๋…ธ๋“œ, ๊ฒ€์ƒ‰ ์‹œ์ž‘ ์ง€์ 
  2. ๋ธŒ๋žœ์น˜ ๋…ธ๋“œ(Branch Node) : ์ค‘๊ฐ„ ๋…ธ๋“œ, ํƒ์ƒ‰ ๊ฒฝ๋กœ
  3. ๋ฆฌํ”„ ๋…ธ๋“œ(Leaf Node) : ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ์ฃผ์†Œ ๋˜๋Š” PK ๊ฐ’ ์ €์žฅ

๐Ÿ“˜ InnoDB ๊ธฐ์ค€ ํŠน์ง•

  • ํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค(Primary Key Index) : ๋ฆฌํ”„ ๋…ธ๋“œ์— ์‹ค์ œ ๋ ˆ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ €์žฅ
  • ๋ณด์กฐ ์ธ๋ฑ์Šค(Secondary Index) : ๋ฆฌํ”„ ๋…ธ๋“œ์— ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ์˜ PK ๊ฐ’๋งŒ ์ €์žฅ → ๋‹ค์‹œ PK ์ธ๋ฑ์Šค๋ฅผ ํ•œ๋ฒˆ ๋” ํƒ€์•ผ ํ•œ๋‹ค. (์ธ๋ฑ์Šค ๋”๋ธ” ์Šค์บ” ๋ฐœ์ƒ)

 

 

๐Ÿ” ์ธ๋ฑ์Šค ์Šค์บ” ๋ฐฉ์‹ ์ •๋ฆฌ

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ๊ฒ€์ƒ‰ ์‹œ, MySQL์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

1๏ธโƒฃ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ” (Index Range Scan)

  • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๊ฐ€ ์ •ํ•ด์ง„ ๊ฒฝ์šฐ
  • ์‹œ์ž‘ ๋ฆฌํ”„ ๋…ธ๋“œ๋ถ€ํ„ฐ ์กฐ๊ฑด ๋งŒ์กฑํ•˜๋Š” ํ‚ค๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ์Šค์บ”
  • index seek → index scan → ๋ฐ์ดํ„ฐ ์กฐํšŒ ์ˆœ์œผ๋กœ ๋™์ž‘
  • ๋žœ๋ค IO ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  • ๋ฒ”์œ„ ์กฐ๊ฑด (BETWEEN, >=, <)์— ์ ํ•ฉ
  • ๊ฐ€์žฅ ๋น ๋ฅธ ์Šค์บ” ๋ฐฉ์‹

2๏ธโƒฃ ์ธ๋ฑ์Šค ํ’€ ์Šค์บ” (Index Full Scan)

  • ์ธ๋ฑ์Šค ์ „์ฒด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ๋Š” ๋ฐฉ์‹
  • ์ธ๋ฑ์Šค ์กฐ๊ฑด์ด ์•ž ์ปฌ๋Ÿผ์ด ์•„๋‹Œ ์ค‘๊ฐ„(B, C ๋“ฑ) ์ปฌ๋Ÿผ์œผ๋กœ ๊ฒ€์ƒ‰ ์‹œ ๋ฐœ์ƒ
  • ์ธ๋ฑ์Šค๋Š” ์‚ฌ์šฉํ•˜์ง€๋งŒ → ์‹ค์ œ ๋ ˆ์ฝ”๋“œ๋Š” ์•ˆ ์ฝ์„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค.

3๏ธโƒฃ ๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ” (Loose Index Scan)

  • ํ•„์š”ํ•œ ์ผ๋ถ€ ํ‚ค๋งŒ ๊ฑด๋„ˆ๋›ฐ๋ฉฐ ์„ ํƒ์ ์œผ๋กœ ์Šค์บ”
  • ์ค‘๊ฐ„ ๋ถˆํ•„์š”ํ•œ ์ธ๋ฑ์Šค ํ‚ค๋Š” ์ƒ๋žต
  • GROUP BY, MIN(), MAX() ๋“ฑ ์ตœ์ ํ™” ์‚ฌ์šฉ
  • ํƒ€์ดํŠธ ์Šค์บ”(์ˆœ์ฐจ์ ) ๋ฐฉ์‹๊ณผ ๋Œ€๋น„๋˜๋Š” ๊ฐœ๋…

 

๐Ÿ’ฅ ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์‹œ ์žฅ๋‹จ์  ์š”์•ฝ

๊ตฌ๋ถ„ ์žฅ์  ๋‹จ์ 
์กฐํšŒ ์‹œ ๋น ๋ฅธ ๊ฒ€์ƒ‰, ์ •๋ ฌ ํšจ์œจ์  -
์‚ฝ์ž…/์ˆ˜์ •/์‚ญ์ œ ์‹œ - ์ •๋ ฌ ์œ ์ง€ ๋น„์šฉ, ์ธ๋ฑ์Šค ๊ฐฑ์‹  ํ•„์š”๋กœ ์„ฑ๋Šฅ ์ €ํ•˜
๋„ˆ๋ฌด ๋งŽ์€ ์ธ๋ฑ์Šค - ์ธ๋ฑ์Šค ์œ ์ง€ ๋น„์šฉ ์ฆ๊ฐ€, ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ์˜คํžˆ๋ ค ์ €ํ•˜ ๊ฐ€๋Šฅ

 

 

๐Ÿง  ์š”์•ฝ ํ‚ค์›Œ๋“œ

ํ•ญ๋ชฉ ํ‚ค์›Œ๋“œ
์ž๋ฃŒ๊ตฌ์กฐ B+Tree, ๋ฆฌํ”„ ๋…ธ๋“œ์— ์‹ค์ œ ๋ ˆ์ฝ”๋“œ(PK)
์ธ๋ฑ์Šค ์ข…๋ฅ˜ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๋ฑ์Šค(Primary), ๋ณด์กฐ ์ธ๋ฑ์Šค(Secondary)
์Šค์บ” ๋ฐฉ์‹ Range Scan, Full Scan, Loose Scan
๋‹จ์  INSERT/UPDATE/DELETE ์„ฑ๋Šฅ ์ €ํ•˜, ๊ณต๊ฐ„ ๋‚ญ๋น„ ๊ฐ€๋Šฅ

 

 

๐Ÿ“˜ ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

์ธ๋ฑ์Šค๋ฅผ ์กฐํšŒ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ ์ž˜๋ชป ์„ค๊ณ„๋˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
์ธ๋ฑ์Šค๊ฐ€ ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์Šค์บ” ๋ฐฉ์‹์ด ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ์•„๋Š” ๊ฒƒ์€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์ˆ˜์ ์ธ ์ง€์‹์ด๋‹ค.