인프런 커뮤니티 질문&답변
수업 코드는 아니지만 페이징 최적화에 대해
작성
·
404
2
안녕하세요 강사님
강의를 수강하면서 따로 토이 프로젝트를 만들어보고있는데
페이징 부분에 대해서 성능 최적화를 어떻게 해야 좋을지 모르겠어서 죄송하게도 강의 내용은 아니지만 질문드려봅니다
public class Board {
..//
@OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
private Set<Comment> comments = new LinkedHashSet<>();
@OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
private Set<BoardAlbum> boardAlbums = new LinkedHashSet<>();
@ManyToOne(fetch = FetchType.LAZY)
private Member member;
제 Board Entity 코드고
수강하면서 조회 성능의 개선을 위해서 ToOne은 Entity Graph로, To Many는 BatchSize 1000을 통한 최적화로 조회 성능을 향상시킬 수 있었는데
페이징의 경우 Desc 를 사용함으로써 속도가 매우 느려짐을 확인했습니다
@Query("SELECT b FROM Board b where b.id<:id order by b.id desc ")
@EntityGraph(attributePaths = {"member"})
Slice<Board> findBoards(Pageable pageable, @Param("id") Long id);
Board 데이터 백만개 기준으로 위의 로직은
제일 자주 보이는 첫 페이지가 평균 2초 ~ 마지막 페이지 거의 0초의 속도로 데이터를 조회합니다..
좀 더 개선해보고자
인덱스는 pk가 인덱스기에 pk로 정하고 no offset으로,
Querydsl을 사용해
public List<~dto> paginationNoOffset(Long boardId, int size) {
return queryFactory
.select(Projections.fields(~ dto))
.from(board)
.join(board.member,member).fetchJoin()
.where(
ltBoardId(boardId),
)
.orderBy(board.id.desc())
.limit(size)
.fetch();
}
private BooleanExpression letBoardId(Long boardId) {
if (boardId == null) {
return null;
}
return board.id.lt(boardId);
}
위와 같이 구성해 테스트해보았으나 오히려 더 느린 4초대가 나오더라구요
강의에 대한 질문은 아니지만
혹시 해답에 대한 언질을 주실 수 있으시다면 감사하겠습니다
답변 1
2
김영한
지식공유자
안녕하세요. 시환님
우선 문제에 집중하기 위해서 예제에서 fetch join 부분을 제거하고 확인해보시면 더 좋을 것 같아요.
추가로 인덱스 이슈일 수 있으니, 다음 키워드로 검색해보시면 도움이 되실거에요.
mysql index desc
쉽게 설명한 블로그 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tyboss&logNo=70019562239
감사합니다.






답변 감사합니다. 확인해보겠습니다!