βπ[Backend Development] SQLμμ INDEXβ
π Intro.
- μΈλ±μ€(INDEX)λ λ°μ΄ν°λ² μ΄μ€μμ κ²μ μ±λ₯μ μ΅μ ννκΈ° μν΄ μ¬μ©νλ μλ£κ΅¬μ‘°μ λλ€.
- λ§μΉ μ± μ λͺ©μ°¨(Table of Contents)μ²λΌ, ν μ΄λΈμμ λ°μ΄ν°λ₯Ό λ λΉ λ₯΄κ² μ°Ύμ μ μλλ‘ λλ κΈ°λ₯μ λλ€.
β 1οΈβ£ μΈλ±μ€μ μν
- β κ²μ μλ ν₯μ β WHERE, ORDER BY, JOIN μ λΉ λ₯΄κ² λ°μ΄ν° μ‘°ν κ°λ₯
- β λ°μ΄ν° μ λ ¬ μ΅μ ν β ORDER BY μ°μ° μ μ λ ¬ μλ ν₯μ
- β μ€λ³΅ λ°©μ§ β UNIQUE INDEXλ₯Ό μ¬μ©νμ¬ μ€λ³΅ λ°μ΄ν° μ½μ λ°©μ§
π μμ (μΈλ±μ€κ° μλ κ²½μ°)
SELECT * FROM users WHERE email = 'example@email.com';
- λ°μ΄ν°λ² μ΄μ€λ λͺ¨λ νμ νλμ© κ²μ¬(Full Table Scan) ν΄μΌ ν¨
- λ°μ΄ν°κ° λ§μμλ‘ κ²μ μλκ° λλ €μ§
π μμ (μΈλ±μ€κ° μλ κ²½μ°)
CREATE INDEX idx_email ON users(email);
SELECT * FROM users WHERE email = 'example@email.com';
- μ΄μ§ νμ(Binary Search)μ ν΅ν΄ λΉ λ₯΄κ² κ²μ κ°λ₯
- Full Table Scanμ λ°©μ§νκ³ μΈλ±μ€λ₯Ό νμ©νμ¬ κ²μ μλ ν₯μ
β 2οΈβ£ μΈλ±μ€μ μ’ λ₯
1οΈβ£ κΈ°λ³Έ(B-Tree) μΈλ±μ€
- κ°μ₯ μΌλ°μ μΈ μΈλ±μ€, B-Tree(Balanced Tree) ꡬ쑰 μ¬μ©
- κ²μ, μ λ ¬, λ²μ μ‘°νμ μ΅μ ν
CREATE INDEX idx_name ON users(name);
2οΈβ£ UNIQUE μΈλ±μ€
- μ€λ³΅λ°©μ§λ₯Ό μν μΈλ±μ€ (μ€λ³΅λ κ° μ½μ λΆκ°)
CREATE UNIQUE INDEX idx_unique_email ON users(email);
INSERT INTO users (id, email) VALUES (1, 'test@email.com');
INSERT INTO users (id, email) VALUES (2, 'test@email.com'); -- β μ€λ₯ λ°μ (μ€λ³΅)
3οΈβ£ 볡ν©(Composite) μΈλ±μ€
- λ κ° μ΄μμ 컬λΌμ κ²°ν©νμ¬ μΈλ±μ€λ₯Ό μμ±
- κ²μ μ‘°κ±΄μ΄ μ¬λ¬ κ°μΌ λ μ μ©
CREATE INDEX idx_name_email ON users(name, email);
SELECT * FROM users WHERE name = 'Alice' AND email = 'alice@email.com';
4οΈβ£ FULLTEXT μΈλ±μ€ (MySQL μ μ©)
- κΈ΄ ν μ€νΈ λ°μ΄ν°(TEXT, VARCHAR)μμ λ¨μ΄ κ²μμ΄ νμν λ μ¬μ©
-
LIKE '%keyword%'
λ³΄λ€ ν¨μ¬ λΉ λ₯Έ κ²μ κ°λ₯
CREATE FULLTEXT INDEX idx_content ON posts(content);
SELECT * FROM posts WHERE MATCH(content) AGAINST ('database');
5οΈβ£ HASH μΈλ±μ€
- μ νν μΌμΉκ²μ(Equality Search)μ μ΅μ νλ¨
- λ²μ κ²μμλ μ ν©νμ§ μμ
CREATE INDEX idx_hash_email USING HASH ON users(email);
SELECT * FROM users WHERE email = 'test@email.com'; -- β
λΉ λ¦
SELECT * FROM users WHERE email = LIKE 'test%'; -- β λλ¦Ό (HASH μΈλ±μ€λ λ²μ κ²μ μ§μ μ ν¨)
β 3οΈβ£ μΈλ±μ€μ μ±λ₯ κ³ λ € μ¬ν
- β μΈλ±μ€λ λΉ λ₯Έ κ²μμ μ 곡νμ§λ§, 무쑰건 λ§μ΄ λ§λ λ€κ³ μ’μ κ²μ μλλλ€.
- β μΈλ±μ€κ° λ§μμλ‘ μ½μ (INSERT), μμ (UPDATE), μμ (DELETE) μ°μ° μλκ° λλ €μ§λλ€.
- β μμ£Ό μ¬μ©νλ μ‘°ν 쿼리μ λ§μΆ° νμν μΈλ±μ€λ§ μμ±νλ κ²μ΄ μ€μν©λλ€
β 4οΈβ£ μΈλ±μ€ μ΅μ ν λ° νμ©
π μ€ν κ³ν(EXPLAIN) νμΈ
μΈλ±μ€λ₯Ό μ νμ©νλμ§ νμΈνλ €λ©΄ EXPLAIN λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ λ©λλ€.
EXPLAIN SELECT * FROM users WHERE email = 'test@email.com';
- Using index β μΈλ±μ€λ₯Ό μ¬μ©νμ¬ μ΅μ νλ 쿼리
- Using full table scan β ν μ΄λΈ μ 체 κ²μ (λλ¦Ό)
β 5οΈβ£ κ²°λ‘
- β μΈλ±μ€λ λ°μ΄ν° κ²μ μλλ₯Ό μ΅μ ννλ ν΅μ¬ λꡬ
- β λ무 λ§μ μΈλ±μ€λ μ€νλ € μ±λ₯μ μ νμν¬ μ μμ
- β μ‘°ν μ±λ₯μ λμ΄λ €λ©΄ EXPLAINμ μ¬μ©νμ¬ μΈλ±μ€ μ΅μ ν