๐ '์ธ๋ฑ์ค'์ ๋ํด์ ์์๋ณด์!
๐ ์ธ๋ฑ์ค ๊ฐ๋
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๊ฒ์(ํํ ๋น ๋ฅด๊ฒ ์กฐํ)ํ ์ ์๋๋ก ๋๋ ์๋ฃ๊ตฌ์กฐ์
๋๋ค.
์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ: Full Scan
- Full Scan:
- ์ ์: ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ํ
์ด๋ธ์ ๋ชจ๋ ํ์ ํ๋์ฉ ๊ฒ์ฌํด์ผ ํฉ๋๋ค.
- ์๊ฐ ๋ณต์ก๋: O(N). ์ฌ๊ธฐ์ N์ ํ
์ด๋ธ์ ์ ์ฒด ํ ์์
๋๋ค.
- ์ฑ๋ฅ: ํฐ ํ
์ด๋ธ์ ๊ฒฝ์ฐ, Full Scan์ ๋งค์ฐ ๋๋ฆฝ๋๋ค. ํนํ ์๋ฐฑ๋ง ๊ฐ์ ํ์ ๊ฐ์ง ๋ํ ํ
์ด๋ธ์์๋ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ
- ๋น ๋ฅธ ๊ฒ์:
- ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์: ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํน์ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ๋ฒ์๋ฅผ ์ขํ ์ ์์ต๋๋ค.
- ์๊ฐ ๋ณต์ก๋: ์ผ๋ฐ์ ์ผ๋ก B-Tree ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด O(log N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
- ๋น ๋ฅธ ์ ๋ ฌ ๋ฐ ๊ทธ๋ฃนํ:
- ์ ๋ ฌ(ORDER BY): ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด๋ฏธ ์ ๋ ฌ๋ ์์๋๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์ปฌ๋ผ์ ๋ํด ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ค ์๋ค๋ฉด, ํด๋น ์ปฌ๋ผ์ผ๋ก ORDER BY๋ฅผ ์ํํ ๋ ๋น ๋ฅด๊ฒ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ๊ทธ๋ฃนํ(GROUP BY): ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ฃนํ ์์
๋ ๋ ๋น ๋ฅด๊ฒ ์ํ๋ ์ ์์ต๋๋ค. ํนํ ๊ทธ๋ฃนํ ๋์ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ๊ทธ๋ฃน์ ๋น ๋ฅด๊ฒ ์๋ณํ๊ณ ์ง๊ณํ ์ ์์ต๋๋ค.
๐ ์ธ๋ฑ์ค ์์ฑ
์ด๋ฏธ ํ
์ด๋ธ์ด ์์ฑ๋ ํ ์ธ๋ฑ์ค ์ง์
-
์ธ๋ฑ์ค ์์ฑ:
- SQL ๋ฌธ:
CREATE INDEX ์ธ๋ฑ์ค๋ช
ON ํ
์ด๋ธ๋ช
(์ปฌ๋ผ๋ช
);
- ์์ :
CREATE INDEX student_name_idx ON student (name);
- ์ด ๋ช
๋ น์ด๋
student ํ
์ด๋ธ์ name ์ปฌ๋ผ์ ๋ํด ์ธ๋ฑ์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ธ๋ฑ์ค๋ ์ค๋ณต๋ ๊ฐ์ด ์์ ์ ์์ต๋๋ค.
-
๊ณ ์ ์ธ๋ฑ์ค ์์ฑ:
- 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์ธ ํํ์ ํ๋๊ฐ ์์ต๋๋ค.