Home > Backend Development > πŸ“š[Backend Development] Covering Index

πŸ“š[Backend Development] Covering Index
Backend Ddevelopment

β€œπŸ“š[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λ₯Ό 쀄여 μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚¬ 수 있음
  • βœ… 인덱슀 크기가 컀질 수 μžˆμœΌλ―€λ‘œ, μ μ ˆν•œ 컬럼만 ν¬ν•¨ν•˜μ—¬ μƒμ„±ν•˜λŠ” 것이 μ€‘μš”.