notification_history 테이블에 status, deadline 복합 인덱스 추가#96
Conversation
🧪 테스트 커버리지 리포트
|
| CREATE INDEX idx_nh_status_deadline | ||
| ON notification_history (status, deadline); |
There was a problem hiding this comment.
인덱스 컬럼 순서 선택 (status 선행, deadline 후행)은 두 쿼리의 사용 패턴에 잘 맞습니다.
다만 두 쿼리에서 이 인덱스가 활용되는 방식이 다릅니다:
findAllRetryableCycles — 인덱스를 완전히 활용
WHERE nh.status = :status -- status 등치 조건 → 인덱스 선두 컬럼
AND nh.deadline > :now -- deadline 범위 조건 → 인덱스 후행 컬럼(status, deadline) 복합 인덱스가 두 컬럼 모두 활용되어 range 스캔으로 개선됩니다.
findAllByScheduledAt — status prefix만 활용
WHERE rc.scheduledAt <= :scheduledAt -- review_cycle 테이블 컬럼 (인덱스 무관)
AND nh.status = :status -- status 등치 조건만 해당이 쿼리에는 deadline이 WHERE 조건에 없으므로 status prefix만 사용됩니다 (EXPLAIN의 ref 결과가 이를 반영). 해당 쿼리 단독이라면 (status) 단일 인덱스와 동일한 효과이지만, findAllRetryableCycles를 위해 deadline을 추가한 설계이므로 두 쿼리를 하나의 인덱스로 커버하는 합리적인 선택입니다.
추가로 findAllByScheduledAt의 rc.scheduledAt <= :scheduledAt 조건은 review_cycle 테이블을 필터링하는데, review_cycle.scheduled_at에 인덱스가 없다면 이 부분에서도 풀스캔이 발생할 수 있습니다. 데이터 규모가 커질 경우 review_cycle(scheduled_at) 인덱스도 함께 검토해보면 좋을 것 같습니다.
리뷰 코멘트스케줄러 실행 주기 설명 불일치PR 설명에서 "매 분/60초 주기로 실행하는 두 쿼리"라고 기재되어 있으나, 실제 코드와 다릅니다.
인덱스 설계 자체는 문제없으나, PR 설명의 전제가 실제 주기와 맞는지 확인 후 업데이트하면 좋을 것 같습니다. 전반적으로80,000건 기준 EXPLAIN 결과를 함께 제시한 점이 좋습니다. |
🚀 작업 내용
notification_history (status, deadline) 복합 인덱스 추가
스케줄러가 매 분/5분 주기로 실행하는 두 쿼리에서
notification_history풀스캔이 발생하는 문제 해결을 위한 인덱스 추가.인덱스 컬럼 순서
status(선행): 등치 조건(= 'PENDING',= 'FAILED')deadline(후행): 범위 조건(> now())EXPLAIN 개선 결과 (더미 데이터 80,000건 기준)
findAllRetryableCyclesfindAllByScheduledAt📸 이슈 번호
✍ 궁금한 점