refactor: ReactionLog 복합 인덱스를 이용한 API 성능 개선 #359
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🌱 관련 이슈
📌 작업 내용 및 특이사항
알림 조회 API 수행시간 개선을 위해 SQL 실행 계획을 분석하였습니다.
SQL문 분석 결과 FriendLogEntity 테이블의 쿼리는 PK 인덱스를 정상적으로 잘 탔지만, ReactionLogEntity 쿼리 실행 계획 분석 결과 풀 테이블 스캔이 발생함을 찾아냈습니다. (참고 사항 사진 참조해주세요!)
Using filesort
: 이 부분이 성능 문제를 야기할 수 있습니다.filesort
는 MySQL이 인덱스를 사용하지 않고 디스크에 임시 파일을 만들어 정렬 작업을 수행하고 있음을 의미합니다. 이는 정렬 작업이 많아질수록성능 저하
를 초래할 수 있습니다. 따라서 이를 개선하기 위해 join 비용을 줄이고receiver_id
를 필드에 추가하였습니다.순차적인 개선을 하였습니다.
먼저 기존 API를 테스트 한 사진을 첨부합니다.
[사진 - 참조1]
먼저 receiver_id를 테이블 필드로 추가하여 join 비용을 줄였습니다.
[사진 - 참조2]
인덱스를 적용하여 수행 시간을 줄였습니다.
[사진 - 참조3]
배포 시 수행해야 할 것
📝 참고사항
[ReactionLogEntity Using filesort 발생]
[참조1 - 기존 API 수행시간 (조회 1000건 수행 - 평균
23ms
)][참조2 - receiver_id 필드 추가 (조회 1000건 수행 - 평균
13ms
/기존 대비 1.76배 개선
)][참조3 - (receiver_id, created_at) 복합 인덱스 추가 (조회 1000건 수행 - 평균
6ms
/ 기존 대비3.83배 개선
)]하지만 1000건 조회이기 때문에 JVM warmup에 따른 편차가 존재할 수 있어 10만건 단위로 조회해보았습니다.
[기존 방식]
[receiver_id 필드 추가]
[복합 인덱스 추가]
해당 결과에서 주의해야 할 건 최대값은 복합 인덱스 추가에서 가장 많이 나왔지만 해당 결과는 outlier이기 때문에 무시해주시면 됩니다. 중요하게 보아야 할 것은
처리량, 수신 KB, 전송 KB
입니다. 개선할수록 해당 값이 높게 나와 성능이 향상된 것을 볼 수 있습니다. 로컬호스트에서는 데이터가 많지 않아 해당 차이가 적지만, 운영을 하면 할수록 해당 API 성능 격차는 점점 커질 것으로 예상됩니다.복합 인덱스
의 효과를 확인하기 위해 cursorCreatedAt 파라미터를 넣고 수행해보았습니다.[기존 API (조회 1000건 수행 / 평균
9ms
][개선된 API (조회 1000건 수행 / 평균
6ms
]