βπ[Backend Development] Covering Index.β
π Intro
Covering Index(컀λ²λ§ μΈλ±μ€)λ 쿼리 μ€ν μ, μΈλ±μ€λ§μΌλ‘ νμν λ°μ΄ν°λ₯Ό λͺ¨λ μΆ©μ‘±νλ κ²½μ°λ₯Ό μλ―Έν©λλ€.
μ¦, ν
μ΄λΈ(μλ³Έ λ°μ΄ν°)μ μ κ·Όνμ§ μκ³ μΈλ±μ€λ§μΌλ‘ κ²°κ³Όλ₯Ό κ°μ Έμ¬ μ μλ μΈλ±μ€μ
λλ€.
β 1οΈβ£ Covering Indexμ ν΅μ¬ κ°λ .
1οΈβ£ μΈλ±μ€ μ€μΊ(Index Scan)λ§μΌλ‘ νμν λͺ¨λ λ°μ΄ν°λ₯Ό μ‘°ν.
- μΌλ°μ μΌλ‘ μΈλ±μ€λ₯Ό μ¬μ©ν΄λ μΌλΆ 컬λΌλ§ κ²μν ν, μΆκ°μ μΌλ‘ ν μ΄λΈμμ λ°μ΄ν°λ₯Ό κ°μ ΈμμΌ νλ κ²½μ°κ° μμ.
- νμ§λ§ Covering Indexλ νμν λͺ¨λ λ°μ΄ν°κ° μΈλ±μ€μ ν¬ν¨λμ΄ μμ΄, ν μ΄λΈ μ‘°νλ₯Ό μλ΅ν μ μμ.
2οΈβ£ 쿼리 μ±λ₯ μ΅μ ν.
- λμ€ν¬ I/O κ°μ : ν μ΄λΈμ μ½μ§ μμΌλ―λ‘ I/O λΉμ© μ κ°.
- 쿼리 μλ ν₯μ : μΈλ±μ€λ§ μ‘°ννλ©΄ λλ―λ‘ μ€ν μλκ° λΉ¨λΌμ§.
- Random I/O κ°μ : ν μ΄λΈ λ°μ΄ν° μ κ·Όμ΄ νμ μμΌλ―λ‘ λΆνμν I/Oλ₯Ό μ΅μνν¨.
β 2οΈβ£ Covering Index λμ λ°©μ.
π μμ ν μ΄λΈ (MySQL κΈ°μ€):
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
age INT,
city VARCHAR(100)
);
π μΌλ°μ μΈ μΈλ±μ€ μ¬μ© (ν μ΄λΈ μ‘°ν νμ)
SELECT name FROM users WHERE age = 30;
- age 컬λΌμ μΈλ±μ€κ° μμ΄λ, name 컬λΌμ κ°μ Έμ€κΈ° μν΄ ν μ΄λΈ μ‘°ν(λ°μ΄ν° νμ΄μ§ μ κ·Ό)κ° νμν¨.
π Covering Index μ¬μ©
CREATE INDEX idx_users_age_name ON users (age, name);
- μΈλ±μ€(idx_users_age_name)κ° ageμ name 컬λΌμ λͺ¨λ ν¬ν¨νλ―λ‘, ν μ΄λΈμ μ‘°νν νμ μμ.
- μΈλ±μ€μμ μ§μ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ―λ‘ μΏΌλ¦¬ μλκ° ν¬κ² ν₯μλ¨.
β 3οΈβ£ Covering Index νμΈ λ°©λ² (MySQL)
μΏΌλ¦¬κ° Covering Indexλ₯Ό μ¬μ©νλμ§ νμΈνλ €λ©΄ EXPLAIN λͺ λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ λ©λλ€.
EXPLAIN SELECT name FROM users WHERE age = 30;
- π Extra 컬λΌμ βUsing indexβκ° νμλλ©΄ Covering Indexκ° μ μ©λ κ² μ λλ€.
π κ²°λ‘
- β Covering Indexλ ν μ΄λΈμ μ‘°ννμ§ μκ³ , μΈλ±μ€λ§μΌλ‘ λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μλ μ΅μ ν κΈ°λ²
- β λμ€ν¬ I/Oμ Random I/Oλ₯Ό μ€μ¬ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ
- β μΈλ±μ€ ν¬κΈ°κ° μ»€μ§ μ μμΌλ―λ‘, μ μ ν 컬λΌλ§ ν¬ν¨νμ¬ μμ±νλ κ²μ΄ μ€μ.