SPRING

[SPRING] 뉴스피드 과제 인덱스 성능 실험

도원좀비 2025. 4. 13. 13:17

🔍 뉴스피드 인덱스 성능 실험

✅ 문제 배경

인덱스를 적용했는데 성능 향상이 전혀 없다는 피드백을 받음

1일차 실험 결과도 만족스럽지 않아서, DB 구조 자체를 다시 초기화하고 실험을 다시 시작함.

 

✅ 실험 재구성

  • DB 삭제 → 재생성으로 모든 인덱스 정보 제거
  • 인덱스 유무에 따른 성능 차이를 명확히 검증

🧪 실험 환경

 

  • MySQL 8.0+
  • 데이터 수: 약 20,000건
  • 각 실험마다 10회씩 진

(조회 쿼리 )

SELECT nf.id, nf.title, nf.content, nf.updated_at
FROM news_feeds nf
WHERE nf.title LIKE '더미 제목%'
  AND nf.updated_at BETWEEN '2025-04-01' AND '2025-05-31'
ORDER BY nf.updated_at DESC
LIMIT 10000;

 


⚙️ 실험 조건

실험 구분 적용 인덱스
인덱스 없음 없음
단일 인덱스 (title) CREATE INDEX idx_news_title ON news_feeds(title);
단일 인덱스 (updated_at) CREATE INDEX idx_news_updated_at ON news_feeds(updated_at);
복합 인덱스 CREATE INDEX idx_title_updated_at ON news_feeds(title, updated_at);

 


📊 실험 결과 요약

실험 총시간 평균(ms) Execution 평균(ms) Fetching 평균(ms) 최소 / 최대 (총시간)
❌ 인덱스 없음 218.3 16.2 202.1 71 / 325
✅ title 인덱스 184.2 15.2 169.0 90 / 353
✅ updated_at 인덱스 209.9 5.8 204.1 95 / 323
✅ 복합 인덱스 178.0 6.0 172.0 89 / 328

✅ 결론

  • 이전 실험에 인덱스가 제대로 삭제가 안된걸로 추정
  • 최소 최대시간은 차이가 없어도 평균에서 차이가 유의미 함
  • 단일 인덱스보다 복합 인덱스가 확실히 우수한걸 확인
  • 정렬 조건까지 포함된 쿼리는 복합 인덱스가 필수

💬 느낀 점

쿼리 최적화는 단순히 인덱스 유무보다 어떤 인덱스를 어디에 어떻게 구성하느냐가 중요

이전에는 그냥 이런식으로

@Table(name = "news_feeds", indexes = {
        @Index(name = "idx_news_title", columnList = "title"),
        @Index(name = "idx_news_content", columnList = "content"),
        @Index(name = "idx_news_updated_at", columnList = "updated_at")
}
)

무식하게 생각안하고 다 집어넣어서 성능 개선이 안되었던걸로 보임

'SPRING' 카테고리의 다른 글

[SPRING] 인터셉터 AOP  (1) 2025.04.15
[SPRING] 뉴스피드 인덱스 실전 테스트  (0) 2025.04.13
[Spring] 스프링 테스트 코드  (3) 2025.04.10
[Spring] 인덱싱  (0) 2025.04.09
[Spring] N+1  (1) 2025.04.09