상세 컨텐츠

본문 제목

데이터베이스 테이블 인덱스 생성을 위해 효율적인 기준은?

IT/DB

by JR 2025. 7. 20. 00:15

본문

300x250
반응형

 

 

 

 

데이터베이스에서 **인덱스(index)**는 쿼리 성능을 향상시키는 핵심 요소입니다. 하지만 무분별하게 생성하면 오히려 쓰기 성능 저하디스크 낭비로 이어질 수 있으므로, 효율적인 기준을 바탕으로 신중하게 설계해야 합니다.

다음은 인덱스를 효율적으로 생성하기 위한 핵심 기준입니다:


✅ 1. WHERE 절/조인 조건에 자주 사용되는 컬럼

  • 자주 조건 검색에 사용되는 컬럼은 인덱스를 만드는 것이 효과적입니다.
SELECT * FROM users WHERE email = 'test@example.com';
 
 

➡️ email 컬럼에 인덱스 생성 추천


✅ 2. JOIN 시 연결되는 컬럼

  • 테이블 간 JOIN에서 사용하는 키 컬럼은 인덱스가 없으면 성능이 크게 떨어집니다.
SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id;
 
 

➡️ orders.customer_id, customers.id에 인덱스 필요


✅ 3. ORDER BY 또는 GROUP BY에 사용되는 컬럼

  • 정렬이나 그룹핑 대상 컬럼에도 인덱스가 유리합니다. 단, WHERE절과 병행 사용 시 효과 극대화.
SELECT * FROM articles WHERE category = 'tech' ORDER BY created_at DESC;
 

➡️ 복합 인덱스: (category, created_at) 추천


✅ 4. 선두 일치 법칙(Left-most Prefix Rule)을 지키는 복합 인덱스

  • 복합 인덱스를 만들 때는 WHERE 조건에 자주 등장하는 컬럼 순서로 배치해야 합니다.

예: 인덱스 (a, b, c)일 때 아래 쿼리는 인덱스 사용 O

 
WHERE a = 1 AND b = 2
 
 

하지만 아래 쿼리는 인덱스 사용 X

WHERE b = 2
 
 

✅ 5. 데이터의 선택도(Selectivity)가 높은 컬럼

  • 선택도 = 특정 값으로 필터링할 때 얼마나 많은 레코드가 걸러지는가
  • 값이 고르게 분포된 컬럼에 인덱스를 걸어야 효과적입니다.

예시>

선택도 높은 컬럼 선택도 낮은 컬럼
이메일, 사용자 ID 성별, 국가, boolean 값 등
 

✅ 6. INSERT/UPDATE가 매우 빈번한 테이블은 신중히 인덱스 구성

  • 인덱스가 많을수록 쓰기 작업 성능 저하 발생
  • 불필요한 인덱스는 제거해야 함

✅ 7. Partial Index, Covering Index 활용 고려

  • Partial Index (조건 인덱스): 조건에 따라 인덱스 범위 제한
  • Covering Index: 쿼리에서 조회하는 컬럼이 인덱스에 모두 포함되어 있으면 테이블 접근 없이 인덱스만으로 조회

🔍 예: 효율적인 복합 인덱스 설계

SELECT * FROM orders WHERE customer_id = 123 AND order_date BETWEEN '2025-01-01' AND '2025-12-31' ORDER BY order_date DESC;
 

➡️ 복합 인덱스 추천: (customer_id, order_date)


❌ 비효율적인 인덱스 예

  • 자주 쓰이지 않는 컬럼에 인덱스
  • 자주 바뀌는 값에 인덱스 (매번 인덱스 재정렬 필요)
  • 너무 많은 인덱스 → INSERT/UPDATE 성능 저하
  • LIKE '%abc' 같은 쿼리 (인덱스 무효화)

📌 결론: 인덱스 설계 체크리스트

 

체크 항목 예/조건
WHERE 절 자주 등장 ✅ 인덱스 고려
JOIN 키로 사용 ✅ 인덱스 필수
ORDER BY, GROUP BY 컬럼 ✅ 인덱스 유리
선택도가 높은 컬럼 ✅ 인덱스 효과 큼
자주 업데이트되는 컬럼 ⚠️ 인덱스 신중히
INSERT/UPDATE/DELETE 많은 테이블인가? ⚠️ 인덱스 최소화
 

 

 

 

300x250
반응형

관련글 더보기