🔍 뉴스피드 인덱스 성능 실험
✅ 문제 배경
인덱스를 적용했는데 성능 향상이 전혀 없다는 피드백을 받음
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 |