DB 인덱스 기본 개념 & 쿼리 튜닝 기초

HelloPong·2025년 8월 7일

공부

목록 보기
18/39
post-thumbnail

📌 DB 인덱스 기본 개념

“DB 인덱스는 책의 목차와 같다”
필요한 데이터를 빠르게 찾게 해주는 장치가 인덱스다.
그런데, 모든 컬럼에 인덱스를 걸면 오히려 성능이 나빠질 수 있다.
그 핵심 이유가 바로 카디널리티, 선택도, 활용도다.

1️⃣ 인덱스(Index)란?

  • 테이블에서 데이터를 빠르게 조회하기 위한 자료구조
  • 일반적으로 B-Tree나 Hash 구조 사용
    = WHERE, JOIN, ORDER BY, GROUP BY 등에 사용

📌 장점

  • 조회 속도 향상
  • CPU·I/O 부하 감소

⚠️ 단점

  • INSERT, UPDATE, DELETE 시 인덱스도 갱신 필요 → 쓰기 성능 저하
  • 저장 공간 추가 사용

2️⃣ 카디널리티(Cardinality)

"서로 다른 값의 개수"

카디널리티 수준

수준의미예시
높음 (High)값이 대부분 다름주민번호, 이메일
중간적당히 다양한 값 존재나이, 생년월일
낮음 (Low)값 종류가 거의 없음성별, Boolean

📌 인덱스 효과

  • 카디널리티가 높을수록 인덱스 효율 ↑
  • 카디널리티 낮은 컬럼에 인덱스 → 효과 거의 없음

3️⃣ 선택도(Selectivity)

"조건이 전체 데이터에서 얼마나 좁은 범위를 선택하는가"

선택도 = 조건에 맞는 행 수 / 전체 행 수

📌 원칙

  • 선택도가 낮을수록(0에 가까울수록) 인덱스 효율 ↑

4️⃣ 활용도(Usage/Utilization)

"인덱스가 실제 쿼리 실행에서 얼마나 자주, 잘 사용되는가"

활용도 높은 경우

  • WHERE 조건이 자주 걸리는 컬럼
  • JOIN, GROUP BY, ORDER BY에서 반복 사용
  • 실행 계획(EXPLAIN)에서 key 컬럼에 인덱스 명시

활용도 낮은 경우

  • 카디널리티 낮은 컬럼에 인덱스 생성
  • 인덱스 있어도 쿼리에서 사용 안 함
  • 함수·형 변환 등으로 인덱스 무효화

5️⃣ 정리 표

개념의미인덱스 설계 시 고려
카디널리티서로 다른 값의 개수높을수록 좋음
선택도조건이 전체에서 좁게 걸리는 정도낮을수록 좋음
활용도실제 쿼리에서 인덱스 사용 빈도높을수록 좋음

✨ 쿼리 튜닝 기초

“느린 쿼리 하나가 서버 전체를 무너뜨릴 수 있다”
쿼리 튜닝은 성능 최적화의 첫걸음이자, 비용 절감의 핵심이다.

1️⃣ 쿼리 튜닝이란?

SQL 쿼리의 성능을 분석하고 개선하여 처리 속도를 높이는 작업

📌 목표

  • 쿼리 실행 시간 단축
  • 서버 부하 감소
  • 더 많은 동시 사용자 처리

2️⃣ 왜 중요한가?

이유설명
🐢 성능 저하 방지느린 쿼리가 전체 API 응답 속도를 늦춤
⚡ 속도 향상불필요한 연산 제거로 수백~수천 배 개선 가능
💸 비용 절감DB 서버 증설 없이도 성능 개선
👥 확장성 확보더 많은 트래픽을 감당 가능
🧠 실력 차별화고급 개발자는 튜닝 능력으로 차별화

3️⃣ 튜닝 전 체크리스트

항목질문
WHERE 조건에 인덱스가 걸려 있는가?EXPLAIN으로 확인
SELECT * 를 쓰고 있지는 않은가?필요한 컬럼만 조회
불필요한 JOIN이 있는가?JOIN 조건 최적화
ORDER BY, GROUP BY에서 Filesort가 발생하는가?인덱스로 해결 가능 여부 확인
LIMIT 처리 방식이 효율적인가?페이징 최적화 (OFFSET 최소화)

4️⃣ Before & After 예시

❌ BEFORE (인덱스 못 탐)

SELECT * FROM orders WHERE DATE(order_time) = '2025-08-07';
  • 함수(DATE()) 사용으로 인덱스 무효화 → Full Table Scan 발생

✅ AFTER (인덱스 탐)

SELECT * FROM orders 
WHERE order_time BETWEEN '2025-08-07 00:00:00' AND '2025-08-07 23:59:59';
  • 범위 조건 사용 → 인덱스 활용 가능

5️⃣ 튜닝 기본 전략

전략설명
📌 필요한 컬럼만 조회SELECT id, name 처럼 최소화
📌 조건 최적화인덱스를 타도록 조건 작성
📌 조인 순서 조정작은 테이블 먼저 접근
📌 통계 갱신ANALYZE TABLE로 옵티마이저 정보 최신화
📌 실행 계획 분석EXPLAIN, EXPLAIN ANALYZE 활용

6️⃣ 마무리

  • 쿼리 튜닝의 핵심은 문제 원인을 정확히 찾는 것
  • 무조건 인덱스를 추가하는 게 아니라 실행 계획을 보고 판단

0개의 댓글