DB - Table & Index

Kjjeddยท2026๋…„ 1์›” 19์ผ

DB

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

๐Ÿ“ฆ ํ…Œ์ด๋ธ”๊ณผ ์ธ๋ฑ์Šค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์“ด๋‹ค๋Š” ๊ฑด ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค.
์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ์ฐพ์„ ๊ฒƒ์ธ๊ฐ€๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š”
ํ…Œ์ด๋ธ”(Table)์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€,
์ธ๋ฑ์Šค(Index)๊ฐ€ ์™œ ์„ฑ๋Šฅ์˜ ํ•ต์‹ฌ์ธ์ง€,
๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๊ณ  ์‹ค์Šตํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•œ๋‹ค ๐Ÿ”ฅ


๐Ÿงฑ ํ…Œ์ด๋ธ”(Table)์ด๋ž€?

ํ…Œ์ด๋ธ”์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฌผ๋ฆฌ์  ๋‹จ์œ„๋‹ค.
๋ชจ๋“  SELECT, INSERT, UPDATE๋Š” ๊ฒฐ๊ตญ ํ…Œ์ด๋ธ”์„ ๋Œ€์ƒ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค.

๐Ÿ“Œ ํ…Œ์ด๋ธ”์˜ ๋ณธ์งˆ์  ์ •์˜

  • ํ…Œ์ด๋ธ” = ํ–‰(Row)๊ณผ ์—ด(Column)์˜ ์ง‘ํ•ฉ
  • ํ–‰(Row) = ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด (๋ ˆ์ฝ”๋“œ)
  • ์—ด(Column) = ๋ฐ์ดํ„ฐ์˜ ์†์„ฑ (ํ•„๋“œ)
  • ๋ชจ๋“  ์—ด์€ ์ž๋ฃŒํ˜•๊ณผ ์ œ์•ฝ์กฐ๊ฑด์„ ๊ฐ€์ง„๋‹ค

๐Ÿ“Š ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ์‹œ๊ฐํ™”

students ํ…Œ์ด๋ธ”

+------------+--------+------------+
| student_id | name   | birthdate  |
+------------+--------+------------+
| 1          | ๊ฐ•๋™์› | 1990-01-01   |
| 2          | ๊น€ํƒœ๋ฆฌ | 1992-02-02   |
+------------+--------+------------+

ํ–‰ (Column) โ†’ ์„ธ๋กœ
์—ด (Row)    โ†’ ๊ฐ€๋กœ

์ค‘์š”ํ•œ ๊ฑด ๋ชจ์–‘์ด ์•„๋‹ˆ๋ผ ๊ทœ์น™์ด ๊ฐ•์ œ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.


๐Ÿ”‘ ํ‚ค(Key) ๊ฐœ๋… ์ •๋ฆฌ

1๏ธโƒฃ ๊ธฐ๋ณธํ‚ค (Primary Key)

๊ธฐ๋ณธํ‚ค๋Š” ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ํ–‰์„ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’์ด๋‹ค.

  • ์ค‘๋ณต ๋ถˆ๊ฐ€ โŒ
  • NULL ๋ถˆ๊ฐ€ โŒ
  • ํ…Œ์ด๋ธ”๋‹น ํ•˜๋‚˜๋งŒ ์กด์žฌ

DB๋Š” ๊ธฐ๋ณธํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ , ์—ฐ๊ฒฐํ•˜๊ณ , ๋ณดํ˜ธํ•œ๋‹ค.

2๏ธโƒฃ ์™ธ๋ž˜ํ‚ค (Foreign Key)

์™ธ๋ž˜ํ‚ค๋Š” ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ปฌ๋Ÿผ์ด๋‹ค.

students        enrollments
---------       ------------
student_id โ—€โ”€โ”€โ”€ student_id

์ด ๊ตฌ์กฐ ๋•๋ถ„์— ๋ฐ์ดํ„ฐ ๊ฐ„ ๊ด€๊ณ„ ๋ฌด๊ฒฐ์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค.


โ“ ์Šคํ‚ค๋งˆ(Schema) vs ํ…Œ์ด๋ธ”(Table)

๐Ÿ“ database
 โ””โ”€ ๐Ÿ“ school_schema
    โ”œโ”€ ๐Ÿ“„ students
    โ”œโ”€ ๐Ÿ“„ courses
    โ””โ”€ ๐Ÿ“„ enrollments
  • ์Šคํ‚ค๋งˆ = ํ…Œ์ด๋ธ”์„ ๋‹ด๋Š” ๋…ผ๋ฆฌ์  ๊ณต๊ฐ„
  • ํ…Œ์ด๋ธ” = ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

๋น„์œ ํ•˜๋ฉด
์Šคํ‚ค๋งˆ = ์—‘์…€ ํŒŒ์ผ
ํ…Œ์ด๋ธ” = ์—‘์…€ ์‹œํŠธ


๐Ÿš€ ์ธ๋ฑ์Šค(Index)์˜ ์ •์ฒด

์ธ๋ฑ์Šค๋Š” ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•œ ๋ณด์กฐ ๊ตฌ์กฐ๋‹ค.
์—†์–ด๋„ ๋™์ž‘์€ ํ•˜์ง€๋งŒ, ์žˆ์œผ๋ฉด ์†๋„๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง„๋‹ค.

๐Ÿ“Œ ์ธ๋ฑ์Šค์˜ ์ •ํ™•ํ•œ ์ •์˜

  • ์ธ๋ฑ์Šค๋Š” ์ •๋ ฌ๋œ ๋ณ„๋„์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค
  • ์›๋ณธ ํ…Œ์ด๋ธ”๊ณผ๋Š” ๋‹ค๋ฅธ ๊ณต๊ฐ„์— ์ €์žฅ๋œ๋‹ค
  • ๋Œ€๋ถ€๋ถ„ B-Tree ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

๐Ÿฆ ํ’€์Šค์บ” vs ์ธ๋ฑ์Šค ํƒ์ƒ‰

[์ธ๋ฑ์Šค ์—†์Œ]
1๋ฒˆ ํ–‰ ํ™•์ธ โŒ
2๋ฒˆ ํ–‰ ํ™•์ธ โŒ
3๋ฒˆ ํ–‰ ํ™•์ธ โŒ
...
โ†’ FULL TABLE SCAN

[์ธ๋ฑ์Šค ์žˆ์Œ]
"student_id = 123"
โ†’ ์ธ๋ฑ์Šค์—์„œ ์œ„์น˜ ํ™•์ธ
โ†’ ํ•ด๋‹น ํ–‰ ๋ฐ”๋กœ ์ ‘๊ทผ โœ…

๋ฐ์ดํ„ฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ด ์ฐจ์ด๋Š” ์น˜๋ช…์ ์ด๋‹ค.


๐Ÿงช ์‹ค์Šต 1: ํ…Œ์ด๋ธ” ์„ค๊ณ„

๐Ÿ“Œ ์š”๊ตฌ์‚ฌํ•ญ

  • ํ•™์ƒ
  • ๊ฐ•์˜
  • ์ˆ˜๊ฐ• ์ •๋ณด

1๏ธโƒฃ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

CREATE TABLE students (
  student_id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  birthdate DATE NOT NULL
);

CREATE TABLE courses (
  course_id INT AUTO_INCREMENT PRIMARY KEY,
  course_name VARCHAR(100) NOT NULL
);

CREATE TABLE enrollments (
  enrollment_id INT AUTO_INCREMENT PRIMARY KEY,
  student_id INT NOT NULL,
  course_id INT NOT NULL,
  enrollment_date DATE NOT NULL,
  FOREIGN KEY (student_id) REFERENCES students(student_id),
  FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

ํ•ต์‹ฌ์€ ์ค‘๋ณต์„ ๊ตฌ์กฐ๋กœ ๋ง‰๋Š” ๊ฒƒ์ด๋‹ค.


๐Ÿงช ์‹ค์Šต 2: ์ธ๋ฑ์Šค ์„ค๊ณ„

๐Ÿ“Œ ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•œ ์ปฌ๋Ÿผ

  • ๊ฒ€์ƒ‰ ์กฐ๊ฑด์— ์ž์ฃผ ์“ฐ์ด๋Š” ์ปฌ๋Ÿผ
  • JOIN์— ์‚ฌ์šฉ๋˜๋Š” ์™ธ๋ž˜ํ‚ค
  • ๋‚ ์งœ ๋ฒ”์œ„ ์กฐํšŒ ์ปฌ๋Ÿผ

1๏ธโƒฃ ์ธ๋ฑ์Šค ์ƒ์„ฑ

CREATE INDEX idx_students_name ON students(name);
CREATE INDEX idx_enroll_student ON enrollments(student_id);
CREATE INDEX idx_enroll_date ON enrollments(enrollment_date);
CREATE INDEX idx_student_course ON enrollments(student_id, course_id);

2๏ธโƒฃ ์™œ ๋ณตํ•ฉ ์ธ๋ฑ์Šค?

(student_id, course_id)๋Š”
๋™์‹œ์— ์กฐ๊ฑด์œผ๋กœ ์ž์ฃผ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

WHERE student_id = 1
  AND course_id = 3

โš ๏ธ ์ธ๋ฑ์Šค์˜ ๋Œ€๊ฐ€

  • INSERT / UPDATE / DELETE ๋น„์šฉ ์ฆ๊ฐ€
  • ๋””์Šคํฌ ๊ณต๊ฐ„ ์ถ”๊ฐ€ ์‚ฌ์šฉ

๊ทธ๋ž˜์„œ ์ธ๋ฑ์Šค๋Š” ๋งŽ์ด ์กฐํšŒ๋˜๊ณ , ์ž์ฃผ ์กฐ๊ฑด์— ์“ฐ์ด๋Š” ์ปฌ๋Ÿผ์—๋งŒ ๊ฑด๋‹ค.


๐Ÿง  ์ตœ์ข… ์ •๋ฆฌ

  • ํ…Œ์ด๋ธ”์€ ๋ฐ์ดํ„ฐ์˜ ์‹ค์ฒด
  • ํ‚ค๋Š” ์ •์ฒด์„ฑ๊ณผ ๊ด€๊ณ„๋ฅผ ์ •์˜
  • ์ธ๋ฑ์Šค๋Š” ์„ฑ๋Šฅ์„ ๊ฒฐ์ •
  • ๊ตฌ์กฐ ์„ค๊ณ„ = ์„ฑ๋Šฅ ์„ค๊ณ„
profile
Gongbuhaja

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