๐Ÿ“š Databases/RealMySQL 8.0

8.3 B-Tree ์ธ๋ฑ์Šค

iseunghan 2023. 4. 26. 22:23
๋ฐ˜์‘ํ˜•

์ธ๋ฑ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜. B๋Š” Binary์˜ ์•ฝ์ž๊ฐ€ ์•„๋‹Œ, Balanced์˜ ์•ฝ์ž์ด๋‹ค.

8.3.1 ๊ตฌ์กฐ ๋ฐ ํŠน์„ฑ

B-Tree์˜ ๊ตฌ์กฐ

  • ์ œ์ผ ์ƒ๋‹จ์— ์žˆ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ, ์ค‘๊ฐ„์— ์žˆ๋Š” ๋ธŒ๋žœ์น˜ ๋…ธ๋“œ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค.
    • ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๊ฐ€๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ์ธ๋ฑ์Šค๋“ค์€ ๋ชจ๋‘ ์ •๋ ฌ์ด ๋œ ์ƒํƒœ๋กœ ์ €์žฅ์ด ๋˜์–ด ์žˆ๋‹ค.
  • ์‹ค์ œ ๋””์Šคํฌ์˜ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ๋ ˆ์ฝ”๋“œ๋Š” ์ •๋ ฌ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.
    • ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด, InnoDB์—์„œ๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋˜์–ด ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ PK ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜์–ด ์ €์žฅ๋œ๋‹ค.

๋ฐ์ดํ„ฐ ๋ ˆ์ฝ”๋“œ ๊ตฌ์กฐ (InnoDB)

๋ฆฌํ”„ ๋…ธ๋“œ์™€ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋ฅผ ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด์ž.

๋ฐ์ดํ„ฐ ํŒŒ์ผ์—๋Š” ๊ฒฐ๊ตญ PK๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” B-Tree๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ์ฐพ์€ ๋‹ค์Œ PK๊ฐ€ ์ €์žฅ๋œ B-Tree ํƒ์ƒ‰์„ ๋˜ ํ•ด์•ผ ํ•œ๋‹ค.

8.3.2 B-Tree ์ธ๋ฑ์Šค ํ‚ค ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ

8.3.2.1 ์ธ๋ฑ์Šค ํ‚ค ์ถ”๊ฐ€

  1. B-Tree์— ์ €์žฅ๋  ๋•Œ๋Š” ์ €์žฅ๋  ํ‚ค ๊ฐ’์„ ์ด์šฉํ•ด B-Tree์ƒ์˜ ์ ์ ˆํ•œ ์œ„์น˜๋ฅผ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค.
  2. ์ €์žฅ๋  ์œ„์น˜๊ฐ€ ๊ฒฐ์ •๋˜๋ฉด ๋ ˆ์ฝ”๋“œ์˜ ํ‚ค ๊ฐ’๊ณผ ๋Œ€์ƒ ๋ ˆ์ฝ”๋“œ์˜ ์ฃผ์†Œ ์ •๋ณด๋ฅผ B-Tree์˜ ๋ฆฌํ”„ ๋…ธ๋“œ์— ์ €์žฅํ•œ๋‹ค.
  3. ๋งŒ์•ฝ, ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๊ฝ‰ ์ฐจ ๋”๋Š” ์ €์žฅํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค.
    1. ์ด ์ž‘์—…์€ ์ƒ์œ„ ๋…ธ๋“œ์—๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ ์ž‘์—…์—๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค.

InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์€ ํ‚ค ์ถ”๊ฐ€ ์ž‘์—…์„ ์ง€์—ฐ์‹œ์ผœ ๋‚˜์ค‘์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ PK, ์œ ๋‹ˆํฌ ์ธ๋ฑ์Šค์˜ ๊ฒฝ์šฐ ์ค‘๋ณต ์ฒดํฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฆ‰์‹œ ์ฒ˜๋ฆฌ ๋œ๋‹ค. (์ฒด์ธ์ง€ ๋ฒ„ํผ๋ฅผ ์ด์šฉํ•ด ์ง€์—ฐ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.)

8.3.2.2 ์ธ๋ฑ์Šค ํ‚ค ์‚ญ์ œ

์‚ญ์ œํ•  ํ‚ค ๊ฐ’์ด ์ €์žฅ๋œ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ์‚ญ์ œ ๋งˆํฌ๋งŒ ํ•˜๋ฉด ์ž‘์—…์ด ๋๋‚œ๋‹ค. ์‚ญ์ œ ๋งˆํ‚น๋œ ์ธ๋ฑ์Šค ํ‚ค ๊ณต๊ฐ„์€ ๊ทธ๋Œ€๋กœ ๋ฐฉ์น˜ ๋˜๊ฑฐ๋‚˜ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งˆํ‚น ์ž‘์—… ๋˜ํ•œ ๋””์Šคํฌ ์“ฐ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ๋Š” ์ด ์ž‘์—…์ด ๋ฒ„ํผ๋ง๋˜์–ด ์ง€์—ฐ ์ฒ˜๋ฆฌ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

8.3.2.3 ์ธ๋ฑ์Šค ํ‚ค ๋ณ€๊ฒฝ

์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์— ๋”ฐ๋ผ ์ €์žฅ๋˜๋Š” ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ์œ„์น˜๊ฐ€ ๊ฒฐ์ •๋˜๋ฏ€๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 1. ๋จผ์ € ํ‚ค๋ฅผ ์‚ญ์ œํ•œ ๋’ค โ†’ 2. ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋ฅผ ํ•œ๋‹ค

์ด ์ž‘์—… ์—ญ์‹œ InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์ด ์ฒด์ธ์ง€ ๋ฒ„ํผ๋ฅผ ํ™œ์šฉํ•ด ์ง€์—ฐ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

8.3.2.4 ์ธ๋ฑ์Šค ํ‚ค ๊ฒ€์ƒ‰

์ธ๋ฑ์Šค๋Š” ์กฐํšŒ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ฃผ์˜๋ฅผ ํ•ด์•ผ ํ•  ์ ๋“ค์ด ์žˆ๋‹ค.

  • LIKE ์กฐ๊ฑด์ผ ๊ฒฝ์šฐ โ€œA%โ€ ๊ฒฝ์šฐ๋Š” ๊ฐ€๋Šฅํ•˜๋‚˜, โ€œ%Bโ€์˜ ๊ฒฝ์šฐ๋Š” ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋‹ค.
  • 100% ์ผ์น˜ ์กฐ๊ฑด์€ ๊ฐ€๋Šฅ
  • ๋ถ€๋“ฑํ˜ธ(<, >) ์กฐ๊ฑด ๊ฐ€๋Šฅ
  • ํ‚ค ๊ฐ’์ด ๋ณ€ํ˜•๋˜๋ฉด ๋ถˆ๊ฐ€๋Šฅ
    • ex) where substr(name, 1) = โ€˜Aโ€™

์ธ๋ฑ์Šค ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” InnoDB ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์—์„œ์˜ ๋ ˆ์ฝ”๋“œ ์ž ๊ธˆ์€ ๊ฒฐ๊ตญ ์ธ๋ฑ์Šค ๋ ˆ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž ๊ทผ ํ›„ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทธ๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ๋Œ€ํ•œ ์ ์€ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ž ๊ทธ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

8.3.3 B-Tree ์ธ๋ฑ์Šค ์‚ฌ์šฉ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ

1. ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์˜ ํฌ๊ธฐ

๋””์Šคํฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ ๋‹จ์œ„๋ฅผ ํŽ˜์ด์ง€๋ผ๊ณ  ํ•œ๋‹ค.

B-Tree๋Š” ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ๊ฐ€๋ณ€์ ์ด๋‹ค. ํŽ˜์ด์ง€ ํฌ๊ธฐ์™€ ํ‚ค ๊ฐ’์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋Š”๋ฐ, MySQL์˜ ํŽ˜์ด์ง€ ํฌ๊ธฐ ๊ธฐ๋ณธ๊ฐ’์ด 16KB์ด๊ณ  ์ž์‹ ๋…ธ๋“œ ์ฃผ์†Œ ์˜์—ญ์ด ๋Œ€๋žต 12๋ฐ”์ดํŠธ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€(16KB)์— 16*1024/(16+12) = 585๊ฐœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ์ž์‹ ๋…ธ๋“œ๋ฅผ 585๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” B-Tree๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์ด 32๋ฐ”์ดํŠธ๋กœ ๋Š˜์–ด๋‚ฌ๋‹ค๋ฉด, 16*1024/(16+32) = 372๊ฐœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒŒ ์™œ ์ค‘์š”ํ•˜๋ƒ๋ฉด, SELECT๋กœ 500๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์ด 16 ๋ฐ”์ดํŠธ์˜€๋‹ค๋ฉด 1๊ฐœ์˜ ํŽ˜์ด์ง€๋งŒ ์ฝ์œผ๋ฉด ๋˜๋Š”๋ฐ, 32๋ฐ”์ดํŠธ์˜€๋‹ค๋ฉด ์ตœ์†Œ 2๊ฐœ ์ด์ƒ ํŽ˜์ด์ง€๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŽ˜์ด์ง€๋ฅผ ์ฝ๋Š” ๋‹ค๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ๋””์Šคํฌ I/O๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๊ณ  ์ด๋Š” ์†๋„๊ฐ€ ๋Š๋ ค์ง„๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

2. B-Tree ๊ธธ์ด

B-Tree ๊นŠ์ด๊ฐ€ 3์ธ ๊ฒฝ์šฐ ๊ฐ€์ง€๋Š” ํ‚ค ๊ฐ’์˜ ์ด ๊ฐœ์ˆ˜

  • ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์ด 16๋ฐ”์ดํŠธ์ผ ๋•Œ: ์ตœ๋Œ€ 2์–ต (585 * 585 * 585)
  • ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์ด 32๋ฐ”์ดํŠธ์ผ ๋•Œ: 5์ฒœ๋งŒ (372 * 372 * 372)

์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์ด ์ปค์ง€๋ฉด ํŠธ๋ฆฌ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์งˆ ๊ฒƒ์ด๊ณ  ์ด๋Š” ์„ฑ๋Šฅ๊ณผ ์ง๊ฒฐ๋œ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์˜ ํฌ๊ธฐ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ์ž‘๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

3. ์„ ํƒ๋„ (๊ธฐ์ˆ˜์„ฑ)

๋ชจ๋“  ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’ ๊ฐ€์šด๋ฐ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ „์ฒด ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์€ 100๊ฐœ์ธ๋ฐ, ๊ทธ ์ค‘ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ์ˆ˜๊ฐ€ 10๊ฐœ๋ผ๋ฉด ๊ธฐ์ˆ˜์„ฑ์€ 10์ด๋‹ค. ์„ ํƒ๋„๊ฐ€ ๋†’์„์ˆ˜๋ก ๊ฒ€์ƒ‰ ๋Œ€์ƒ์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ๋„์›€์ด ๋œ๋‹ค.

์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž

์ „์ฒด ๋ ˆ์ฝ”๋“œ ์ˆ˜๋Š” 1๋งŒ ๊ฑด์ด๊ณ , country ์ปฌ๋Ÿผ์œผ๋กœ๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ 1:

  • ์ผ€์ด์Šค A: country ์ปฌ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜(๊ธฐ์ˆ˜์„ฑ)๊ฐ€ 10๊ฐœ
  • ์ผ€์ด์Šค B: country ์ปฌ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜(๊ธฐ์ˆ˜์„ฑ)๊ฐ€ 1,000๊ฐœ
select * from test where country='korea' and city='seoul';

MySQL์—์„œ๋Š” ์ธ๋ฑ์Šค์˜ ํ†ต๊ณ„ ์ •๋ณด(์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜)๊ฐ€ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— city ์ปฌ๋Ÿผ์˜ ๊ธฐ์ˆ˜์„ฑ์€ ์ž‘์—… ๋ฒ”์œ„์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ๋ชปํ•œ๋‹ค. ์œ„ ์ฟผ๋ฆฌ๋Š” ์ผ€์ด์Šค A์˜ ๊ฒฝ์šฐ ํ‰๊ท  1,000๊ฑด, B์˜ ๊ฒฝ์šฐ ํ‰๊ท  10๊ฑด์ด ์กฐํšŒ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ํ•ด๋‹น๋˜๋Š” ๊ฒฐ๊ณผ ๋ ˆ์ฝ”๋“œ๊ฐ€ 1๊ฑด๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด, ์ผ€์ด์Šค A๋Š” 1๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•ด ์“ธ๋ชจ์—†๋Š” 999๊ฑด์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋” ์ฝ์—ˆ์ง€๋งŒ, ์ผ€์ด์Šค B๋Š” 9๊ฑด๋งŒ ๋” ์ฝ์€ ๊ฒƒ ์ด๋‹ค.

4. ์ฝ์–ด์•ผ ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ์˜ ๊ฑด์ˆ˜

๋ ˆ์ฝ”๋“œ๊ฐ€ 100๋งŒ ๊ฑด์ด ์žˆ๋Š”๋ฐ 50๋งŒ ๊ฑด์„ ์ฝ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์ฝ๊ธฐ์˜ ์†์ต ๋ถ„๊ธฐ์ ์ด ์–ผ๋งˆ์ธ์ง€ ํŒ๋‹จํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”๋ฐ, ์ผ๋ฐ˜์ ์ธ DBMS์˜ ์˜ตํ‹ฐ๋งˆ์ด์ €์—์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๋ ˆ์ฝ”๋“œ 1๊ฑด์„ ์ฝ๋Š” ๊ฒƒ์ด ํ…Œ์ด๋ธ”์—์„œ ์ง์ ‘ ๋ ˆ์ฝ”๋“œ 1๊ฑด์„ ์ฝ๋Š” ๊ฒƒ๋ณด๋‹ค 45๋ฐฐ ์ •๋„ ๋น„์šฉ์ด ๋“ ๋‹ค๊ณ  ์˜ˆ์ธกํ•œ๋‹ค. ์ฆ‰ ์ฝ์–ด์•ผ ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๊ฐ€ ์ „์ฒด ๋ ˆ์ฝ”๋“œ์˜ 2025%๋ฅผ ๋„˜์–ด์„œ๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ํ…Œ์ด๋ธ”์„ ์ฝ๋Š”๋‹ค.

๊ฐ•์ œ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ์ฝ์–ด ๋“ค์ด๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

8.3.4 B-Tree ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

8.3.4.1 ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”

์ธ๋ฑ์Šค์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ• ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‹ค.

select * from test where first_name between 'Ebbe' and 'Gad';

์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”์€ ์ธ๋ฑ์Šค์˜ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  1. ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ๋น„๊ตํ•ด ๋ธŒ๋žœ์น˜ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ ๋ฆฌํ”„ ๋…ธ๋“œ๊นŒ์ง€ ๋„๋‹ฌํ•ด์•ผ ํ•„์š”ํ•œ ๋ ˆ์ฝ”๋“œ์˜ ์‹œ์ž‘ ์ง€์ ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (์ธ๋ฑ์Šค ํƒ์ƒ‰)
  2. ์‹œ์ž‘ํ•ด์•ผ ํ•  ์œ„์น˜๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด, ๊ทธ๋•Œ๋ถ€ํ„ฐ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ์ˆœ์„œ๋Œ€๋กœ ์ฝ์œผ๋ฉด ๋œ๋‹ค. (์ธ๋ฑ์Šค ์Šค์บ”(์ธ๋ฑ์Šค ํƒ์ƒ‰์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Œ)
    1. ๋‚ด๋ฆผ์ฐจ์ˆœ, ์˜ค๋ฆ„์ฐจ์ˆœ์— ๋”ฐ๋ผ ์ •์ˆœ ๋˜๋Š” ์—ญ์ˆœ์œผ๋กœ ์ฝ์„ ์ˆ˜ ๋„ ์žˆ๋‹ค.
  3. ๋งŒ์•ฝ ์Šค์บ”ํ•˜๋‹ค๊ฐ€ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๋๊นŒ์ง€ ์ฝ์œผ๋ฉด ๋ฆฌํ”„ ๋…ธ๋“œ ๊ฐ„ ๋งํฌ๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๋‹ค์‹œ ์Šค์บ”ํ•œ๋‹ค.
  4. ์ตœ์ข…์ ์œผ๋กœ ๋ฉˆ์ถฐ์•ผ ํ•  ์œ„์น˜์— ๋„๋‹ฌํ•˜๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ์Šค์บ”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

8.3.4.2 ์ธ๋ฑ์Šค ํ’€ ์Šค์บ”

์ธ๋ฑ์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ชจ๋‘ ์ฝ๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

์ธ๋ฑ์Šค ๊ตฌ์„ฑ : (first_name, last_name)

select * from test where last_name like '%B';

์ฟผ๋ฆฌ์˜ ์กฐ๊ฑด์ ˆ์— ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ์ด ์ธ๋ฑ์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์ปฌ๋Ÿผ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ํ’€ ์Šค์บ” ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ๋ฑ์Šค๋Š” (A, B, C)์˜ ์ˆœ์„œ๋กœ ๋งŒ๋“ค์–ด์กŒ์ง€๋งŒ ์ฟผ๋ฆฌ์˜ ์กฐ๊ฑด์ ˆ์€ B ์ปฌ๋Ÿผ์ด๋‚˜ C ์ปฌ๋Ÿผ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

  • ์ฟผ๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค์— ๋ช…์‹œ๋œ ์ปฌ๋Ÿผ๋งŒ์œผ๋กœ ์กฐ๊ฑด์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ฃผ๋กœ ์ด ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ธ๋ฑ์Šค์˜ ํฌ๊ธฐ๋Š” ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”๋ณด๋‹ค๋Š” ํšจ์œจ์ ์ด๋‹ค.

8.3.4.3 ๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”

๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”์€ ์ธ๋ฑ์Šค ๋ ˆ์ธ์ง€ ์Šค์บ”๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ, ์ค‘๊ฐ„์— ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ์ธ๋ฑ์Šค ํ‚ค ๊ฐ’์€ ๊ฑด๋„ˆ๋›ฐ๋ฉด์„œ ์Šค์บ”ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ GROUP BY ๋˜๋Š” ์ง‘ํ•ฉ ํ•จ์ˆ˜ ๊ฐ€์šด๋ฐ MAX(), MIN() ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ตœ์ ํ™”๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, (dept_no, emp_no) ์กฐํ•ฉ์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

  • ์ด๋Š” dept_no, emp_no ์กฐํ•ฉ์œผ๋กœ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
select dept_no, MIN(emp_no)
from dept_emp
where dept_no between 'd002' and 'd004'
group by dept_no;

์œ„ ์ฟผ๋ฆฌ๋Š” depth_no ๊ทธ๋ฃน ๋ณ„๋กœ ์ œ์ผ ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋งŒ ์ฝ์œผ๋ฉด ๋œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šค์บ”ํ•˜๊ฒŒ ๋œ๋‹ค.

+---------------------+
| dept_no  |  emp_no  |
**|   d002   |  100000  | <- ์Šค์บ”**
|   d002   |  103401  | -- ์—ฌ๊ธฐ์„œ ๋ถ€ํ„ฐ d002๋ผ๋ฉด ๋ชจ๋‘ ์Šคํ‚ต!
|   ....   |  ......  |
+---------------------+
...
+---------------------+
| dept_no  |  emp_no  |
**|   d004   |  200000  | <- ์Šค์บ”**
|   d004   |  203401  | -- ์—ฌ๊ธฐ์„œ ๋ถ€ํ„ฐ d004๋Š” ๋ชจ๋‘ ์Šคํ‚ต!
|   d004   |  203432  |
|   ....   |  ......  |
+---------------------+

8.3.4.4 ์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ”

์ธ๋ฑ์Šค์˜ ๊ตฌ์„ฑ์ด ์ค‘์š”ํ•œ ์ด์œ ๋Š” ํ•ด๋‹น ํ‚ค ๊ฐ’์˜ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. ์ธ๋ฑ์Šค๋Š” (col1, col2)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

select * from test where col2='b'; // X
select * from test where col1='a' and col2='b'; // O

col2 ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ๋ฟ๋”๋Ÿฌ, ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ์„ ํ•ด์•ผ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, 8.0 ๋ถ€ํ„ฐ๋Š” ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ col1 ์ปฌ๋Ÿผ์„ ๊ฑด๋„ˆ๋›ฐ์–ด col2 ์ปฌ๋Ÿผ๋งŒ์œผ๋กœ๋„ ์ธ๋ฑ์Šค ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ” ์ตœ์ ํ™” ๊ธฐ๋Šฅ์ด ๋„์ž…๋๋‹ค.

๋ฌผ๋ก  ์ด์ „ ๋ฒ„์ „์—์„œ๋„ ์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ”๊ณผ ๋น„์Šทํ•œ ๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”๋„ ์žˆ์—ˆ์ง€๋งŒ ๋ฃจ์Šค ์ธ๋ฑ์Šค ์Šค์บ”์€ GROUP BY ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ 8.0 ๋ถ€ํ„ฐ ๋„์ž…๋œ ์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ”์€ WHERE ์ ˆ๊นŒ์ง€ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์šฉ๋„๊ฐ€ ํ™•์žฅ๋˜์—ˆ๋‹ค.

์ธ๋ฑ์Šค ์Šคํ‚ต ์Šค์บ”์€ ๋‹จ์ ์ด ์žˆ๋‹ค.

  • WHERE ์กฐ๊ฑด์ ˆ์— ์กฐ๊ฑด์ด ์—†๋Š” ์ธ๋ฑ์Šค์˜ ์„ ํ–‰ ์ปฌ๋Ÿผ์˜ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์–ด์•ผ ํ•œ๋‹ค.
    • ๋งŒ์•ฝ ์„ ํ–‰ ์ปฌ๋Ÿผ์ด ์‚ฌ์›๋ฒˆํ˜ธ ์ฒ˜๋Ÿผ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ๋ชจ๋“  ์‚ฌ์› ์ˆ˜ ๋งŒํผ ๋ ˆ์ธ์ง€ ์Šค์บ” ์‹œ์ž‘ ์ง€์ ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•ด ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค.
  • ์ฟผ๋ฆฌ๊ฐ€ ์ธ๋ฑ์Šค์— ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ(์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค)
    • ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์กฐํšŒํ•˜๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด, ์ด๋Š” ๋‚˜๋จธ์ง€ ์ปฌ๋Ÿผ์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์œผ๋กœ ์‹คํ–‰๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•œ๋‹ค.
๋ฐ˜์‘ํ˜•