Refactor: video테이블에 count 칼럼에 인덱스 부여#138
Merged
Munhangyeol merged 2 commits intoICT-Dev-Route:mainfrom Jan 5, 2025
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
🔎 작업 내용
video 테이블에
count칼럼에 인덱싱 부여자세한 내용은 아래에
findTop3Videos() 메서드 리팩토링
페이징 기법에 대한 고려
원래 리팩토링을 위해서 페이징 기법을 사용하려고 했으나, 현재의 비즈니스 로직과 맞지 않음을 공부하는 과정에서 알게 되었다.
페이징 기법은 게시판에서 전체 데이터를 그때 그때 보여주는 게 아닌, 게시판에 보여지는 데이터의 갯수만 서버단에서 클라이언트단으로 넘겨줌으로써 (이 때 넘겨주는 데이터 리스트의 단위를 페이지라고 한다), 훨씬 나은 성능을 제공하는 기법이다.
따라서 현재 최적화하려는 findTop3Videos의 경우와는 다르다.
findTop3Videos는 시작 페이지에서만 상위 조회수 3개의 비디오를 보여주는 경우이므로, 위처럼 페이지 단위의 리스트를 클라이언트 단으로 넘겨줄 이유가 없음을 알게 되었다.
인덱싱 도입
Spring Data JPA에서는 단순한 SQL의
OrderBy와Limit의 기능을findTop3ByOrderByCountDesc()처럼Top이Limit의 기능을,OrderBy를OrderByCountDesc를 통해서 이름을 정의함으로써 기능을 만들 수 있다.findTop3ByOrderByCountDesc()은 다음과 같은 쿼리를 만든다.이 쿼리 내에서는 우선 정렬을 하고, 상위 3개의 결과를 반환하는데, MySQL 옵티마이저는
정렬 시 indexing이 안 되어있으면 버퍼에 데이터를 넣어두고 정렬하는
filesort를 사용한다.하지만 인덱싱을 활용하면 sort를 거치지 않고, 결과를 반환하기에 더 빠른 결과를 가져올 수 있다.
현재 count에 대한 인덱싱이 되어 있지 않아, 레코드 수가 많아지면 정렬 과정을 거쳐야 하므로 느려질 수밖에 없다.
따라서 count에 대해서 인덱스를 적용해보고자 한다.
추가 공부 사항
인덱싱 성능 테스트
인덱싱 적용
인덱싱 적용 코드
@Index속성namecolumnListuniquetrue로 설정하면 인덱스를 유니크 인덱스로 생성. 기본값은false.총 갯수가 1000개일 때
인덱싱 적용 전
인덱싱 적용 후
총 갯수가 10000개일 때
인덱싱 적용 전
인덱싱 적용 후
총 갯수가 100000개일 때
인덱싱 적용 전
인덱싱 적용 후
조건에 맞는 로우의 갯수가 많아지면?
데이터가 1000개일 때
쿼리
조건에 맞는 로우의 갯수가 많아질 때의 결과 분석
적용 전
적용 후
결과에 대한 고찰
조건에 맞는 로우의 갯수가 전체 데이터 비율 중 적은 경우
조건에 맞는 로우의 갯수가 전체 데이터 비율 중 많은 경우
원인 분석
랜덤 IO 발생
오버헤드 증가
순차 접근의 효율성
결론
참고 출처