
| ์ด ๊ธ์ MySQL์ InnoDB ์คํ ๋ฆฌ์ง ์์ง์ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค index๊ฐ ๋ฌด์์ผ๊น? index๊ฐ ๋ฌด์์ธ์ง, ์ ์ฌ์ฉํ๋์ง? ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ์ ๋ ํจ๊ณผ์ ์ธ์ง ์ด์ ๋ถํฐ ์์๋ณด๊ณ ์ ํ๋ค.
ํ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ์๊ฐํด๋ณด์. ๊ด๊ณํ DB๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฆ์ด ์ง์์ธ ํ์์ ์ฐพ์ผ๋ ค๋ฉด
SELECT * FROM student WHERE name = '์ง์' ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆด ๊ฒ์ด๋ค.
๊ทธ๋ผ ๋ง์ฝ ํ์ ํ
์ด๋ธ์ ๋ ์ฝ๋ ๊ฐ์๊ฐ ๋ฐฑ๋ง๊ฐ๊ฐ ๋์ด๊ฐ๋ค๋ฉด? ๊ทธ ๋ฐฑ๋ง๊ฐ์ ๋ ์ฝ๋๋ฅผ ํ๋์ฉ ๋ณด๋ฉด์ ์ง์์ ์ฐพ์ ๊ฒ์ด๋ค.(์ฆ, Full Scan์ ํ๋ค. ์๊ฐ ๋ณต์ก๋๋ O(N)) ์ด๊ฒ์ด ๊ณผ์ฐ ํจ์จ์ ์ผ๊น? ๋ง์ฝ ๋ ์ฝ๋์ ๊ฐ์๊ฐ 100์ต๊ฐ๊ฐ ๋์ด๊ฐ๋ค๋ฉด? ํ๋์ฉ ๋ณด๋ฉด์ ์ฐพ๋ ์ฟผ๋ฆฌ๊ฐ ๋์์ ์ฌ๋ฌ ์ฌ์ฉ์๋ค์ ์ํด์ ์คํ๋๋ค๋ฉด? ์ปดํจํฐ์ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์๋นํ๊ฒ ๋๋ฉด์ ๋ฒํ
จ๋ด์ง ๋ชปํ ๊ฒ์ด๋ค.

์ถ์ฒ: https://youtu.be/BIlFTFrEFOI?si=jOewqpSWUuRC67-P
ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ index๋ฅผ ์ฌ์ฉํ๋ค๋ฉด? ํจ์ฌ ๋น ๋ฅธ ์ฑ๋ฅ์ผ๋ก ์กฐ๊ฑด์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๋ค. ์ด๋, ์ด ์ธ๋ฑ์ค๊ฐ B- tree ๊ธฐ๋ฐ์ ์ธ๋ฑ์ค๋ผ๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ O(logN)์ด ๋๋ค.
๋ฐ๋ผ์, ์ธ๋ฑ์ค๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํํ๋ค์ ๋น ๋ฅด๊ฒ ์ฐพ์๋ด๊ธฐ ์ํด, ๋น ๋ฅด๊ฒ ์ ๋ ฌ(order by)ํ๊ฑฐ๋ ๊ทธ๋ฃนํ(group by) ํ๊ธฐ ์ํด ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒ์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ์์ฃผ ์ฌ์ฉ๋๋ค.
์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๊ฒ์ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
(MySQL InnoDB๊ธฐ์ค)
ํน์ ์ปฌ๋ผ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด ํด๋น ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ค์ ์ ๋ ฌ๋์ด ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ์ฃผ์์ ํจ๊ป ์ ์ฅ๋๋ค.ย ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋จผ์ ์ธ๋ฑ์ค์์ ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํ๊ณ , ์๋ค๋ฉด ๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ์ฃผ์๋ก ์ด๋ํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ง์ฝ ์ธ๋ฑ์ค์ ์กด์ฌํ์ง ์๋๋ค๋ฉด DB๋ฅผ ์์ฐจ ๊ฒ์ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ด๋ฏ๋ก ํ
์ด๋ธ์ ์กฐํ ์๋๋ฅผ ํฅ์์ํฌ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๊ธฐ ๋๋ฌธ์ ORDER BY ๊ฐ์ด ๋ถํ๊ฐ ๋ง์ด ๊ฑธ๋ฆฌ๋ ์์
๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ณ ์ฒ์๊ณผ ๋์ ๊ฐ์ ธ์ค๋ MIN, MAX๋ ๋นจ๋ฆฌ ๊ตฌํ ์ ์๋ค.

์ถ์ฒ: https://youtu.be/iNvYsGKelYs?si=2B2EMtvsfOhyvc3j
ํ์ง๋ง, ์ธ๋ฑ์ค๊ฐ ์ ์ฉ๋ย ์ปฌ๋ผ์ ์์ /์ญ์ ๋ฑ์ ์์
์ด ๋ค์ด๊ฐ๋ฉด ์๋ณธ ํ
์ด๋ธ ๋ฟ๋ง ์๋๋ผ ์ฐ๊ฒฐ๋์ด ์๋ ์ธ๋ฑ์ค์๋ ๋๊ฐ์ด ๋ฐ์ํ๊ณ ์ ๋ ฌ์ ํด์ค์ผ ํด์ ์ค๋ฒํค๋๊ฐ ์ฆ๊ฐํ๋ค๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก INSERT, DELETE, UPDATE ๊ฐ์ DML ์์
์ด ๋ง์ด ๋ฐ์ํ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์ ๋ฐ์ดํฐ๊ฐ ์ธ๋ฑ์ค์ ์ ์ฅ๋ ์ ์์ผ๋ฏ๋ก, ์ฑ๋ฅ์ด ์คํ๋ ค ์ ํ๋ ์ ์๋ค.
๋ํ, ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ DB์ ์ฝ 10%์ ํด๋นํ๋ ์ ์ฅ๊ณต๊ฐ์ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ํ๋ค. ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๋๋ง๋ค ์ฉ๋์ ์ฐจ์งํ๋ ๊ฒ์ด๋ฏ๋ก ๊ฒ์ ์์ ์ด ํ์์๋ ์ปฌ๋ผ๋ค์ ๊ตณ์ด ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด ๋์ ํ์๋ ์๋ค.
์ฐธ๊ณ ๋ก, ๊ธฐ๋ณธํค๋ index๋ฅผ ์์ฑํ ํ์ ์๋ค. ์๋ ์์ฑ๋๋ค.

์ ๊ฐ์ ํ
์ด๋ธ์ ๋ง๋ค๊ณ ๋์ ์ด ํ
์ด๋ธ์ ์์ฑ๋ ์ธ๋ฑ์ค๋ฅผ ๋ณด๊ธฐ ์ํด show index from tasks; ๋ฅผ ์
๋ ฅํ๋๋ ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค. ์ฐธ๊ณ ๋ก, ์์ด๋๋ auto increment๋ก ์ค์ ํ๋ค. ๋๋ ์ด๋ค ์ธ๋ฑ์ค๋ ๋ง๋ค์ง ์์์ง๋ง id ์ปฌ๋ผ์ ๋ํ PRIMARY KEY ์ธ๋ฑ์ค(ํด๋ฌ์คํฐ๋ ์ธ๋ฑ์ค)์ ์ธ๋ ํค๋ก ์ธํ id ์ปฌ๋ผ์ ๋ํ ์ธ๋ฑ์ค(columns ํ
์ด๋ธ๊ณผ์ ๊ด๊ณ)๊ฐ ์๋์ผ๋ก ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. (MySQL ๊ธฐ์ค)

์ธ๋ฑ์ค๋ ๊ตฌํ ๋ฐฉ์์ ์ฌ๋ฌ ์ข ๋ฅ๊ฐ ์๋ค. ๊ทธ ์ค ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ์ ํ๋ค์ ์ ๋ฆฌํด๋ณด์๋ค.
์์๋ Claude์ ํ์ ๋น๋ ธ๋ค.
Ex) MySQL
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
CREATE INDEX idx_student_name ON students(name);
Ex) MySQL - MEMORY ์์ง
CREATE TABLE student_session (
student_id INT,
session_token VARCHAR(100),
INDEX USING HASH (student_id)
) ENGINE = MEMORY;
Ex) SQL Server
CREATE TABLE student_grades (
student_id INT PRIMARY KEY CLUSTERED,
course_id INT,
grade DECIMAL(3,2)
);
Ex) SQL Server
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE NONCLUSTERED INDEX idx_student_email ON students(email);
Ex) MySQL
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(100),
grade VARCHAR(2)
);
CREATE INDEX idx_name_grade ON students(name, grade);
Ex) Elasticsearch
PUT /student_essays
{
"mappings": {
"properties": {
"title": { "type": "text" },
"content": { "type": "text" }
}
}
}
Ex) Oracle
CREATE TABLE students (
id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50)
);
CREATE INDEX idx_full_name ON students(LOWER(first_name || ' ' || last_name));
1. ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋๋ฌธ ์ปฌ๋ผ. DML ์์
์ด ์์ฃผ ๋ฐ์ํ์ง ์๋ ์ปฌ๋ผ
2. JOIN, WHERE, ORDER BY ๊ฐ์ด ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ค์ํ ์ํฅ์ ๋ฏธ์น๋ ์ปฌ๋ผ
ORDER BY ์ ์ ์ฌ์ฉ๋๋ ์ด์ ๋ฐ์ดํฐ ํ์ด์ง๊ฐ ์๋ ์ ๋ ฌ๋๊ธฐ ๋๋ฌธ์ ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค๊ฐ ์ ๋ฆฌํ๋ค.
3. ๋ฐ์ดํฐ์ ์ค๋ณต๋๊ฐ ๋ฎ์, ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ์ปฌ๋ผ
์๋ฅผ ๋ค์ด, ๋ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ 'ํ๋
' ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ํ๋
์ ๋ณดํต 1ํ๋
๋ถํฐ 4ํ๋
๊น์ง๋ก ์ ํ๋๋ฏ๋ก ์ด๋ ๋งค์ฐ ๋ฎ์ ์นด๋๋๋ฆฌํฐ๋ฅผ ๊ฐ์ง ๊ฒ์ด๋ค. ๋ฐ๋ผ์ 3ํ๋
ํ์์ ์ฐพ๋ ์ฟผ๋ฆฌ๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์ฝ 25%์ด์์ ๊ฒ์ํด์ผ ํ ์ ์๊ณ ์ด๋ ์ธ๋ฑ์ค์ ํจ๊ณผ๋ฅผ ํฌ๊ฒ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
4. ์ ํ๋(Selectivity)๊ฐ ๋์, ์ฆ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ ์ฒด ๋ฐ์ดํฐ์ 10-15% ์ดํ๋ฅผ ๋ฐํํ๋ ์ปฌ๋ผ
WHERE A = 20 AND b = 50 ๊ฐ์ ์กฐ๊ฑด์ธ ์ฟผ๋ฆฌ์์ A๋ง Index๊ฐ ์์ฑ๋์ด์๋ค๋ฉด ๊ฒฐ๊ตญ B๊ฐ ๋ง์กฑํ๋์ง ์ฐพ๊ธฐ ์ํด A๋ฅผ ๋ง์กฑํ๋ ๊ฒฐ๊ณผ์์ Full Scan์ ํด์ผ ํ๋ค.
๋ฐ๋ผ์, ์ด ์ฟผ๋ฆฌ๊ฐ ํจ๊ณผ์ ์ด๋ ค๋ฉด A์ B๋ฅผ ๋ฌถ์ ์ธ๋ฑ์ค๊ฐ ํ์ํ๋ค! ์ด๋ ๊ฒ 2๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ด ๋ฌถ์ ์ธ๋ฑ์ค๋ฅผ multicolumn index, composite index ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํ๋์ ์ปฌ๋ผ๋ง์ ๊ธฐ์ค์ผ๋ก ์์ฑ๋ ์ธ๋ฑ์ค๋ ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค, Single-Column Index๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋, ์ฌ๋ฐ๋ ์ ์ (A, B)์ (B, A)๋ ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค๋ผ๋ ๊ฒ์ด๋ค! ๐ซขย ์ธ๋ฑ์ค๊ฐ โญ๏ธ์ ๋ ฌ๋โญ๏ธ ๋ชฉ๋ก์ด๋ผ๋ ๊ฒ์ ๋ค์ ๋ ์ฌ๋ ค๋ณด์. A์ B๋ฅผ ๋ฌถ์ด์ ์ธ๋ฑ์ค๋ก ๋ง๋ค๋ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ ํ ๊น? ๋ฐ๋ก ์ผ์ชฝ๋ถํฐ์ด๋ค. ๋ฐ๋ผ์ (A, B) ๋ A๋ฅผ ๊ธฐ์ค์ผ๋ก , (B, A) ๋ B๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค. ๋ฐ๋ผ์ ์ด๋ค ์์๋ก ๋ฐฐ์น์ํค๋์ ๋ฐ๋ผ์ ์๋๊ฐ ์ ๋ง ์ฐจ์ด๊ฐ ๋ง์ด ๋ ์ ์๋ค. ์ด๋ฐ ๋ค์ค ์ปฌ๋ผ์ ์ธ๋ฑ์ฑํ ๋์๋ ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ์ปฌ๋ผ์์ ๋ฎ์ ์ปฌ๋ผ ์์ผ๋ก ์ธ๋ฑ์ฑํด์ผ ์ข์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
๋ง์ฝ (A, B) ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์๋ ์ํ์์ WHERE B = 20 ์กฐ๊ฑด์ธ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๊น? ๋๋ถ๋ถ ์๋๋ค. ๐
ย ํด๋น ์ธ๋ฑ์ค๋ A๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋์ด ์๋ ์ํ์ด๊ณ B๋ ์ ๋ ฌ๋์ด์์ง ์๋ค. ๋ฐ๋ผ์ ์ด ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ์ ์์ฐ๊ฑฐ๋ ๊ฒฐ๊ตญ Full Scan์ ํด์ผ ํ๋ค.
๋ํ, ์ฐ๋ฆฌ๊ฐ ๋ช ์ํ์ง ์์ผ๋ฉด ์ฃผ๋ก DBMS์ optimizer(SQL์ ์ํํ ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ต์ ์ ์ฒ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์์ฑํด ์ฃผ๋ DBMS์ ํต์ฌ ์์ง)๊ฐ ์คํ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๋ฑ์ค ์ค ๊ฐ์ฅ ํจ์จ์ ์ธ ๊ฒ์ ์ ํํ๋๋ฐ, ํน์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋๋ก ๋ช ์ํ๊ณ ์ถ๋ค๋ฉด MySQL ๊ธฐ์ค ์๋์ ๊ฐ์ด ์ธ๋ฑ์ค๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ์ง์ ํด๋ optimizer๊ฐ ๋ ํจ์จ์ ์ธ๊ฒ ์๋ค๊ณ ์๊ฐํ๋ฉด ๊ทธ๊ฒ์ ์ด๋ค๊ณ ? ํ๋ค. ์ด๊ฑด ๊ฐ์์์ ๋ค์ ๋ด์ฉ์ธ๋ฐ, ์ด๋ด๊ฑฐ๋ฉด ๊ฐ์ ์ต์ ์ด ์ ์๋์ง ์๋ฌธ์ด๋ผ ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ฐพ์๋ด์ผ๊ฒ ๋ค.
SELECT * FROM player FORCE INDEX (backnumber_idx) WHERE backnumber = 7;SELECT * FROM player USE INDEX (backnumber_idx) WHERE backnumber = 7;๊ฐ ์ฟผ๋ฆฌ๋ฌธ์ ์ด๋ค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๊น์? index ์์๋๋ก 1 2 3 ์ค์ ๊ณ ๋ฅด์์ค.

์ถ์ฒ: https://youtu.be/IMDH4iAQ6zM?si=RSs2N0hGzIkkVhkG
EXPLAIN ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ฟผ๋ฆฌ์ ๋ํ ์คํ ์ ๋ณด๋ฅผ ์์๋ณด์.
์ค์ต์ ์์, ์ธ๋ฑ์ค์ ํจ๊ณผ๋ฅผ ๋๋ผ๊ธฐ ์ํด 500๋ง๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ฃ์ด๋์๋ค. ๐

์ง์ ๊ฒ์
SELECT * FROM User WHERE name = '์ตํ์'; ์ ์คํํ์ ๋์ ๊ฒฐ๊ณผ๋ค. 1.89์ด๊ฐ ๊ฑธ๋ฆฐ ๊ฒ์ ๋ณผ ์ ์๋ค.

EXPLAIN ์ ํตํด ์์ธํ ๋ณด๋ type์ด ALL์ด๊ณ possible_keys, key, ref๊ฐ ๋ชจ๋ NULL์ธ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด์ , ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด๋ณด์. ์ค์ต์ ์ํด ๊ฐ ์ปฌ๋ผ๋ง๋ค ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด์คฌ๋ค.

์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์๋ 1.89 โก๏ธย 0.27์ด๋ก ์ค์ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค! ๐ซข

EXPLAIN ์ ํตํด ์์ธํ ๋ณด๋ type์ด ref๊ณ possible_keys, key, ref๊ฐ ์๊น์๋ ๋ฌ๋ฆฌ NULL์ด ์๋๋ค! ํนํ possible_keys, key์๋ ์๊น ์์ฑํ index ์ด๋ฆ์ด ๋ค์ด๊ฐ์๋ค. ์ด๊ฒ๋ค์ด ๋ฌด์์ ์๋ฏธํ๋ ๊ฑธ๊น?

type์ ์กฐ์ธ ์ ํ์ด๋ค. ref๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ๋๋ฑ ๋น๊ต๋ก ์ ๊ทผํจ์ ์๋ฏธํ๋ค.
possible_keys๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๋ฑ์ค์ด๋ค. 'idx_name'์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
key๋ ์ค์ ์ฌ์ฉ๋ ์ธ๋ฑ์ค๋ก, ํ์ฌ ์ฟผ๋ฆฌ์์๋ 'idx_name'๊ฐ ์ฐ์๋ค. ์ด์ ์ ์์ฑํ ์ธ๋ฑ์ค๊ฐ ์ ์ฐ์ด๊ณ ์๋ ๊ฒ์ด๋ค.
ref๋ ์ธ๋ฑ์ค์ ๋น๊ต๋๋ ์ด์ด๋ ์์์ด๋ค. ์ฆ, ์ธ๋ฑ์ค๋ฅผ ์ด๋ค ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๊ฒ์ํ๋์ง๋ฅผ ์๋ฏธํ๋ค. 'const'๋ ์์ ๊ฐ๊ณผ ๋น๊ต๋จ์ ์๋ฏธํ๋ค.
์์์ ๊ณ์ํด์ ๋งํ๋ ์ธ๋ฑ์ค๋ ์ ๋ ฌ๋์ด ์๋ค.(๋๋ถ๋ถ)๋ฅผ ๋ ์ฌ๋ ค๋ณด์! ์ด ํน์ง์ ํนํ ORDER BY ๊ฐ์ ์กฐ๊ฑด์ ๋์ฑ ํจ๊ณผ์ ์ด๋ผ๊ณ ํ๋ ๋งํผ, ์ ๋ง ๊ทธ๋ฐ์ง ์ง์ ํด๋ณด์.
SELECT * FROM User ORDER BY money DESC LIMIT 100;
3.55์ด๊ฐ ๊ฑธ๋ฆฌ๋ ์กฐํ๊ฐ 0์ด ๋๋ก ์ค์ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค! ์ญ์ ์ ๋ ฌ์ ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ ๊ฐ๋ค.
์ด๋ type์ด ์๊น ์ง์ ๊ฒ์ ๊ฒฝ์ฐ์๋ ๋ค๋ฅด๋ค. ref์์ index๋ก ๋ณ๊ฒฝ๋์๋๋ฐ, ์ด๋ ์ธ๋ฑ์ค ์ ์ฒด๋ฅผ ์ค์บํ๋ค๋ ์๋ฏธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋๋ฐ๋ possible_keys๋ NULL์ธ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ํน์ WHERE ์กฐ๊ฑด์ด ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๋ฑ์ค๊ฐ ์ง์ ๋์ง ์์ ๊ฒ์ด๋ค.
2๊ฐ ์ด์์ ์ปฌ๋ผ์ ๋ฌถ์ด์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํด๋ณด์. ์ฐ์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์๊ณ , 2.20์ด๊ฐ ๊ฑธ๋ ธ๋ค.
SELECT * FROM User WHERE money BETWEEN 1000000 AND 2000000 AND start_date >= '2020-01-01';

INDEX idx_money_start_date ON User(money, start_date);
๊ทธ๋ฆฌ๊ณ ์ ๋ช ๋ น์ด๋ฅผ ํตํด money์ start_date๋ฅผ ์์๋๋ก ํ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ณ ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋๋ฐ,,,,

๋,,, ์ค๋ ๊ฑธ๋ฆฐ๋ค?? ๐ฏ ์ผ๋ถ๋ฌ ํจ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ํด ์ปฌ๋ผ ์์๋ ์ฟผ๋ฆฌ๋ ๋๊ฐ์ด ๋ฐฐ์นํ๋๋ฐ ๋ ์ค๋๊ฑธ๋ ค์ ๋นํฉ์ค๋ฌ์ ๋ค.

EXPLAIN์ ํตํด ์ดํด๋ด๋ ์ธ๋ฑ์ค๋ฅผ ์ ์ฐ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ,, ๋ฌด์์ด ๋ฌธ์ ์ผ๊น? ์ถ์ด์ ์๊ฐํ๋ค ๋จธ๋ฆฌ์์ ์ค์น๋ ๊ฒ์ด ์์๋ค. ๋ฐ๋ก SELECT * ๋ก ๋ชจ๋ ์ปฌ๋ผ์ ์์ฒญํ๊ณ ์๋ค๋ ๊ฒ์ด์๋ค.
์ ๋ง SELECT * ๋๋ฌธ์ธ์ง ๊ถ๊ธํ์ฌ ์ด๋ฒ์๋ ๋ชจ๋ ์ปฌ๋ผ์ ์์ฒญํ์ง ์๊ณ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค(Covering Index)์ฒ๋ผ ์ฌ์ฉ๋๋๋ก id, money, start_date๋ฅผ ์์ฒญํ๋ค.

1.92์ด์์ 0.04์ด๋ก ์ค์ด๋ค๋ฉด์ ์ธ๋ฑ์ค๊ฐ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋ ๊ฒ์ ๋๋ ์ ์์๋ค!

์ธ๋ฑ์ค์๋ ํ์ํ ์ปฌ๋ผ๋ง ์๊ณ ๋๋จธ์ง ์ปฌ๋ผ์ ํ ์ด๋ธ์ ์ค์ ๋ฐ์ดํฐ ํ์ด์ง์ ๋ณ๋๋ก ์ ์ฅ๋์ด ์๋ค. ์ฆ, SELECT *๋ ๋ชจ๋ ์ปฌ๋ผ์ ๋ค ์ฝ์ด์ผ ํ๋ฏ๋ก, ์ธ๋ฑ์ค๋ฅผ ํตํด ์กฐ๊ฑด์ ๋ง๋ row ์์น(๋ ์ฝ๋ ์ฃผ์)๋ฅผ ์ฐพ์ผ๋ฉด ๊ทธ ๋ค์์ ํ ์ด๋ธ์์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋๋ค I/O๋ก ๋ค ์ฝ์ด์์ผ ํ๋ ๊ฒ์ด๋ค. ์ด ์์ ๋๋ฌธ์ ์ํ๋๋งํผ ๋น ๋ฅด์ง ์์ ๊ฒ์ด๋ค.
์ค์ต์ ํ๋ฉด์ ๋๋ ๊ฒ์ ๋ด๊ฐ ์๊ฐํ ์ธ๋ฑ์ค์ ๋์์ด ์์๊ณผ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค๋ ๊ฒ์ด๋ค. ๋ํ, ๋ณตํฉ ์ธ๋ฑ์ค์์ ๋ฐฐ์น ์์ ๋ฟ๋ง ์๋๋ผ ์ด๋ค ์ปฌ๋ผ์ ์์ฒญํ๋๋์ ๋ฐ๋ผ์ ์ ์ ํ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์์ฃผ ์ค์ํ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.

์ถ์ฒ: https://youtu.be/NZgfYbAmge8?si=O7hFw5B7PwdlWiCg
์ธ๋ฑ์ค๋ ๋ง๋ฅ์ด ์๋๋ค.
๊ฒ์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง, Index๋ฅผ ์๋ฌด๋ ๊ฒ๋ ๋ง๋ ๋ค๊ณ ์ฑ๋ฅ์ด ํฅ์๋์ง ์๋๋ค. ์ด๋ป๊ฒ ๋ฐฐ์นํด์ผ ํจ๊ณผ์ ์ผ์ง ๊ณ ๋ฏผํ๊ณ , ์ฟผ๋ฆฌ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์ปฌ๋ผ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ์์ฑํด์ผ ํ๋ค. ๊ฒ์ ์๋๊ฐ ๋น ๋ฅด๋ค๊ณ ๋ฌด๋ถ๋ณํ๊ฒ ๋ง๋ค๋ฉด ์๋๋ค!
์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ๋ง์ด ๋ค์ด์๋ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์๊ฐ์ด ๋ช ๋ถ ์ด์ ์์๋ ์ ์๊ณ DB ์ฑ๋ฅ์ ์์ข์ ์ํฅ์ ์ค ์ ์๋ค. ๋ง์ฝ ์ค์ ์ด์์ค์ธ ์๋ฒ์์ ์์ฒ๋ง๊ฑด์ ๋ฐ์ดํฐ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ ๋ค๋ฉด..? ์ต์ ์ ๊ฒฝ์ฐ ์๋น์ค๊ฐ ์ ๊น ๋ฉ์ถ ์ ์๋ค. ๐ย
์ธ๋ฑ์ค๋ฅผ ๋ง๋ ๋ค๊ณ ๋ฌด์กฐ๊ฑด ๋นจ๋ผ์ง๋ ๊ฒ๋ ์๋๋ค. table์ ๋ฐ์ดํฐ๊ฐ ์กฐ๊ธ ์์ ๋, ์กฐํํ๋ ค๋ ๋ฐ์ดํฐ๊ฐ ํ ์ด๋ธ์ ์๋น ๋ถ๋ถ์ ์ฐจ์งํ ๋๋ ์คํ๋ ค full scan์ด ๋ ๋น ๋ฅผ ์ ์๋ค. ํ ์ด๋ธ๋น 4~5๊ฐ ๊ถ์ฅ์ด๋ผ๊ณ ํ๋ค.
ํ์ง๋ง, ์ ์์ฑํ๊ณ ์๋ง ์ฐ๋ฉด ์ธ๋ฑ์ค์ ๋งค์ฐ ํจ๊ณผ์ ์ด๋ค. ์ธ๋ฑ์ค๊ฐ ์ ๋ ฌ๋์ด ์๋ค๋ ํน์ง์ ๊ฒ์ ์๋๋ฅผ ํฅ์์ํฌ ๋ฟ๋ง ์๋๋ผ ์์คํ ์ฑ๋ฅ๋ ํฅ์์ํฌ ์ ์๋ค. ๋ํ, ์กฐ์ธ ์กฐ๊ฑด์ ์ฐ์ด๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ๋งค์นญ๋๋ ๋ฐ์ดํฐ๋ฅผ ํจ์ฌ ๋นจ๋ฆฌ ์ฐพ์ ์ ์์ด์ ์ ์ฒด์ ์ธ ์ฟผ๋ฆฌ ์๋๊ฐ ์ฌ๋ผ๊ฐ ์ ์๋ค.
index๊ฐ ๋ญ์ง ์ค๋ช ํด๋ณด์ธ์ (๊ฐ๋ฐ๋ฉด์ ์๊ฐ)
SQL indexing best practices | How to make your database FASTER!
[DB] ์ธ๋ฑ์ค(Index)๋ก DB ๊ฒ์ ์๋๋ฅผ ๋์ฌ๋ณด์
SQL Indexes - Definition, Examples, and Tips
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค(Index) 3๋ถ ์์ฝ ์ ๋ฆฌ
[MYSQL] ๐ ์ธ๋ฑ์ค(index) ํต์ฌ ์ค๊ณ & ์ฌ์ฉ ๋ฌธ๋ฒ ๐ฏ ์ด์ ๋ฆฌ