๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [SQL] '์ธ๋ฑ์Šค(INDEX): B-Tree' ํŽธ

ybkยท2024๋…„ 5์›” 31์ผ

sql

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

๐Ÿ”” '์ธ๋ฑ์Šค'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ ์ธ๋ฑ์Šค ๊ฐœ๋…

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

์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ: Full Scan

  • Full Scan:
    • ์ •์˜: ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ํ–‰์„ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(N). ์—ฌ๊ธฐ์„œ N์€ ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ํ–‰ ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ์„ฑ๋Šฅ: ํฐ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ, Full Scan์€ ๋งค์šฐ ๋А๋ฆฝ๋‹ˆ๋‹ค. ํŠนํžˆ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ํ–‰์„ ๊ฐ€์ง„ ๋Œ€ํ˜• ํ…Œ์ด๋ธ”์—์„œ๋Š” ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

  • ๋น ๋ฅธ ๊ฒ€์ƒ‰:
    • ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒ€์ƒ‰: ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํŠน์ • ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ„ ๋ณต์žก๋„: ์ผ๋ฐ˜์ ์œผ๋กœ B-Tree ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด O(log N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ์ •๋ ฌ ๋ฐ ๊ทธ๋ฃนํ™”:
    • ์ •๋ ฌ(ORDER BY): ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ด๋ฏธ ์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ํด๋Ÿฌ์Šคํ„ฐํ˜• ์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ ค ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ปฌ๋Ÿผ์œผ๋กœ ORDER BY๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ทธ๋ฃนํ™”(GROUP BY): ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ฃนํ™” ์ž‘์—…๋„ ๋” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ทธ๋ฃนํ™” ๋Œ€์ƒ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ๋ฃน์„ ๋น ๋ฅด๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ์ธ๋ฑ์Šค ์ƒ์„ฑ

์ด๋ฏธ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋œ ํ›„ ์ธ๋ฑ์Šค ์ง€์ •

  1. ์ธ๋ฑ์Šค ์ƒ์„ฑ:

    • SQL ๋ฌธ: CREATE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช… (์ปฌ๋Ÿผ๋ช…);
    • ์˜ˆ์ œ: CREATE INDEX student_name_idx ON student (name);
    • ์ด ๋ช…๋ น์–ด๋Š” student ํ…Œ์ด๋ธ”์˜ name ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ๋ฑ์Šค๋Š” ์ค‘๋ณต๋œ ๊ฐ’์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ณ ์œ  ์ธ๋ฑ์Šค ์ƒ์„ฑ:

    • SQL ๋ฌธ: CREATE UNIQUE INDEX ์ธ๋ฑ์Šค๋ช… ON ํ…Œ์ด๋ธ”๋ช… (์ปฌ๋Ÿผ๋ช…1, ...);
    • ์˜ˆ์ œ: CREATE UNIQUE INDEX classroom_id_number_idx ON student (classroom_id, number);
    • ์ด ๋ช…๋ น์–ด๋Š” classroom_id์™€ number ์†์„ฑ์„ ์กฐํ•ฉํ•˜์—ฌ ๊ณ ์œ  ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฐ˜(classroom_id) ๋‚ด์—์„œ๋Š” ๋ฒˆํ˜ธ(number)๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ ์ธ๋ฑ์Šค ์ง€์ •

์ฒ˜์Œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

CREATE TABLE student (
    id INT PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    classroom_id INT NOT NULL,
    number INT NOT NULL,
    INDEX student_name_idx (name),
    UNIQUE INDEX classroom_id_number_idx (classroom_id, number)
);
  • PRIMARY KEY: id ํ•„๋“œ๋Š” ๊ธฐ๋ณธ ํ‚ค๋กœ ์ง€์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ ํ‚ค์—๋Š” ์ž๋™์œผ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • INDEX: name ํ•„๋“œ์— ๋Œ€ํ•ด ์ผ๋ฐ˜ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • UNIQUE INDEX: classroom_id์™€ number ํ•„๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๊ณ ์œ  ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ™์€ ๋ฐ˜์—์„œ ๋ฒˆํ˜ธ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค๋ช… ์ƒ๋žต ๊ฐ€๋Šฅ: ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฆ„์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ์ด๋ฆ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ณตํ•ฉ ์ธ๋ฑ์Šค (Composite Index)

  • ๋ณตํ•ฉ ์ธ๋ฑ์Šค: ๋‘ ๊ฐœ ์ด์ƒ์˜ ์—ด์„ ์กฐํ•ฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ์ธ๋ฑ์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์ œ: UNIQUE INDEX classroom_id_number_idx (classroom_id, number)
    • ์ด๋Ÿฐ ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” classroom_id์™€ number์˜ ์กฐํ•ฉ์ด ๊ณ ์œ ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ์—ฌ๋Ÿฌ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์žˆ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ์กฐํšŒ

SHOW INDEX FROM student;

student ํ…Œ์ด๋ธ”์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์˜ ์ด๋ฆ„, ์—ด, ๊ณ ์œ  ์—ฌ๋ถ€ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ’Ÿ B-Tree(Balanced Tree, ๊ท ํ˜• ํŠธ๋ฆฌ) ๊ตฌ์กฐ

  • ๊ฐ ๋…ธ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค ๊ฐ’๊ณผ ์ž์‹ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ , ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ ์ตœ์†Œํ™”๋˜์–ด ๋ชจ๋“  ์—ฐ์‚ฐ์ด O(log N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ด์ง„ ํƒ์ƒ‰(Binary Search)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ :
1. ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.
2. ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’์€ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋ฐ์ดํ„ฐ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.
3. ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋„ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์ด๋‹ค.


๐ŸŽˆ B-Tree ์˜ˆ์ œ

1. Where a = 9

  • Members ํ…Œ์ด๋ธ”์ด ์žˆ๊ณ , a ํ•„๋“œ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค๋Š” a ๊ฐ’๊ณผ Members ํ…Œ์ด๋ธ”์˜ ํŠœํ”Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค์—์„œ a = 9๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด binary search๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์šด๋ฐ ๊ฐ’์„ ์„ ํƒํ•˜์—ฌ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

Step 1:

  • ์ธ๋ฑ์Šค ์ค‘๊ฐ„ ๊ฐ’: 7 (a=7)
    • 7 < 9์ด๋ฏ€๋กœ ์•„๋ž˜์ชฝ ๋ถ€๋ถ„์„ ๋ฌด์‹œํ•˜๊ณ  ์œ„์ชฝ ๋ถ€๋ถ„์„ ํƒ์ƒ‰

Step 2:

  • ๋‚จ์€ ์ธ๋ฑ์Šค ๊ฐ’: [7, 9, 10]
  • ์ธ๋ฑ์Šค ์ค‘๊ฐ„ ๊ฐ’: 7 (a=7)
    • 7 < 9์ด๋ฏ€๋กœ ์•„๋ž˜์ชฝ ๋ถ€๋ถ„์„ ๋ฌด์‹œํ•˜๊ณ  ์œ„์ชฝ ๋ถ€๋ถ„์„ ํƒ์ƒ‰

Step 3:

  • ๋‚จ์€ ์ธ๋ฑ์Šค ๊ฐ’: [9, 10]
  • ์ธ๋ฑ์Šค ์ค‘๊ฐ„ ๊ฐ’: 9 (a=9)
    • 9 == 9์ด๋ฏ€๋กœ ๊ฐ’์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
    • ์ด ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€์„œ Members ํ…Œ์ด๋ธ”์—์„œ ํ•ด๋‹น ํŠœํ”Œ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

2. INDEX(a), Where a = 7 And b = 95

  • ์ธ๋ฑ์Šค์—์„œ a = 7์„ ์ฐพ๊ธฐ ์œ„ํ•ด binary search๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Step 1:

  • ์ธ๋ฑ์Šค ์ค‘๊ฐ„ ๊ฐ’: 7 (a=7)
    • 7 < 9์ด๋ฏ€๋กœ ์•„๋ž˜์ชฝ ๋ถ€๋ถ„์„ ๋ฌด์‹œํ•˜๊ณ  ์œ„์ชฝ ๋ถ€๋ถ„์„ ํƒ์ƒ‰

Step 2:

  • ๋‚จ์€ ์ธ๋ฑ์Šค ๊ฐ’: [7, 9, 10]
  • ์ธ๋ฑ์Šค ์ค‘๊ฐ„ ๊ฐ’: 7 (a=7)
    • 7 < 9์ด๋ฏ€๋กœ ์•„๋ž˜์ชฝ ๋ถ€๋ถ„์„ ๋ฌด์‹œํ•˜๊ณ  ์œ„์ชฝ ๋ถ€๋ถ„์„ ํƒ์ƒ‰
    • 7 == 7์— ํ•ด๋‹นํ•˜๋Š” Members์˜ b๊ฐ€ 95์ธ ํŠœํ”Œ ํƒ์ƒ‰

๋‹จ์  : a์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ a = 7์„ ์ฐพ๊ณ , ๊ทธ ๋‹ค์Œ b = 95๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Members ํ…Œ์ด๋ธ”์—์„œ ์ „์ฒด ํƒ์ƒ‰(full scan)์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


3. INDEX(a,b), Where a = 7 And b = 95

  • ์ธ๋ฑ์Šค์—์„œ a = 7, b = 95์„ ์ฐพ๊ธฐ ์œ„ํ•ด binary search๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • a๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋จผ์ € ์ •๋ ฌํ•˜๊ณ  a์˜ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด b๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

Step 1:

  • ์ธ๋ฑ์Šค ์ค‘๊ฐ„ ๊ฐ’: 7 (a=7)
    • 7 < 9์ด๋ฏ€๋กœ ์•„๋ž˜์ชฝ ๋ถ€๋ถ„์„ ๋ฌด์‹œํ•˜๊ณ  ์œ„์ชฝ ๋ถ€๋ถ„์„ ํƒ์ƒ‰

Step 2:

  • ๋‚จ์€ ์ธ๋ฑ์Šค ๊ฐ’: [7, 9, 10]
  • ์ธ๋ฑ์Šค ์ค‘๊ฐ„ ๊ฐ’: 7 (a=7)
    • 7 < 9์ด๋ฏ€๋กœ ์•„๋ž˜์ชฝ ๋ถ€๋ถ„์„ ๋ฌด์‹œํ•˜๊ณ  ์œ„์ชฝ ๋ถ€๋ถ„์„ ํƒ์ƒ‰
    • a๊ฐ€ 7 == 7์ด๋ฉด b๋ฅผ ๋น„๊ต
    • b๊ฐ€ 95๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•„๋ž˜ ์ชฝ์— ์žˆ๋Š” b = 55์™€ b = 95๋ฅผ ๋น„๊ตํ•˜๋Š”๋ฐ 95๊ฐ€ ๋” ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ์ชฝ์œผ๋กœ ๊ฐˆ ์ˆ˜๋ก 95๋ณด๋‹ค ์ž‘์œผ๋‹ˆ ์ด ๋ถ€๋ถ„๋„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
    • ์œ„์ชฝ์— ์žˆ๋Š” b = 98์€ 95๋ณด๋‹ค ํฌ๋‹ˆ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ a = 7 , b = 95์ธ ํŠœํ”Œ์€ ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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