728x90
이상형월드컵 게임을 위해 랜덤 정렬이 필요했다.
그래서 querydsl에서 사용해 보려고 관련 자료들을 찾아보았다.
.orderBy(NumberExpression.random().asc())
해당 방법을 사용하면 SQLSyntaxErrorException이 발생하며, MySql 버전이 맞지 않는다고 한다.
그래서 우선은 @Query 어노테이션을 이용해서 직접 작성해 주었다.
@Query("SELECT c FROM Candidate c WHERE c.worldCup.id = :worldCupId ORDER BY RAND() LIMIT :teamCount")
해당 방법으로 해서 개발을 진행하다 문득 querydsl에도 방법이 있지 않을까 싶어 좀 더 찾아보니 방법이 있었다.
.orderBy(Expressions.numberTemplate(Double.class, "function('rand')").asc())
하지만 위 두 방법 모두 mysql의 RAND() 함수를 사용하도록 명령을 내리게 된다.
RAND() 함수를 사용할 경우, 쿼리를 실행할 때마다 새로운 난수를 생성하므로 인덱스를 사용하지 못하고, 모든 행을 스캔해야 한다.
이는 데이터가 많을수록 성능에 부정적인 영향을 미친다고 한다.
물론, 월드컵 후보로 등록할 수 있는 최대치가 크지 않기 때문에 큰 상관은 없을 것 같긴 하다만, 마땅히 좋은 방법을 찾지 못했다.
728x90
'개발일지 > 돌픽' 카테고리의 다른 글
Google Custom Search API 사용해보기 (0) | 2023.04.30 |
---|---|
테스트 시 SpringSecurity 비활성화 하기 (0) | 2023.04.28 |
Querydsl .orderBy() (0) | 2023.04.27 |
도메인 별로 enum 관리 (0) | 2023.04.19 |
이상형월드컵 프로젝트 (0) | 2023.04.18 |