DevKim

[Refactor] 쿼리 성능 개선 본문

Spring Project/Webtooniverse

[Refactor] 쿼리 성능 개선

on_doing 2021. 8. 12. 10:58
728x90

[ exists 쿼리 개선 ]

해당 id의 존재 여부 확인하는 쿼리

기존의 count 쿼리 날려서 1개 이상 존재하는지 확인하는 코드에서 아래의 코드로 리팩토링

 

count 쿼리는 전체 데이터를 조회해야하니, 데이터가 많아질수록 성능을 기대하긴 힘들다.

Data Jpa의 exists 메소드 쿼리를 사용해도 내부적으로 count 쿼리가 날라가는 것은 마찬가지이다.

public boolean existsById(Long userId,Long webtoonId){
        return jpaQueryFactory.from(myList)
                .where(myList.user.id.eq(userId), myList.webtoon.id.eq(webtoonId))
                .select(myList.id)
                .fetchFirst()!=null;
    }

fetchFirst의 null 유무를 체크하면 count -> limit를 사용하도록 변경된다.

select mylist0_.my_list_id as col_0_0_ 
	from my_list mylist0_
    where mylist0_.user_id=? and mylist0_.toon_id=? 
    limit ?

[ Best reviewer 쿼리 최적화 ] 

1. QueryDsl 사용 / Jmeter로 부하 테스트 진행

 

2. Query - review 작성한 개수가 많은 user / user가 작성한 review 총 개수 / review의 전체 like 수 조회

  • (기존) - 작성한 review가 가장 많은 user를 내림차순으로 가져와 user로 리뷰를 찾아와 루프돌며 like수 합산
  • (변경) - user/reivew개수/like개수 한 번에 조회하는 query로 변경
  • (효과) - 부하 테스트에서 기존 응답속도 1250msec에서 395msec로 개선

 

*기존*

Throughput

 

*변경 후*

 

Throughput

728x90
Comments