woowacourse-teams / 2022-mo-rak

🥳 모락: 모임을 즐겁게, 편하게!
https://mo-rak.com
51 stars 6 forks source link

refactor: role history 에 query dsl 을 적용하고 복합 인덱스를 생성한다. #609

Closed leo0842 closed 1 year ago

leo0842 commented 1 year ago

Close #608

배경 지식

query dsl

복합 인덱스

  • 복합 인덱스는 여러 컬럼을 묶어서 인덱스로 저장한다.
  • 조건절에 여러 컬럼이 사용되거나 조건절, 그룹화에 사용되는 컬럼이 다른 경우에 인덱스를 탈 수 있도록 복합 인덱스를 설정한다.
  • 순서가 존재하여 이를 잘 숙지해야 한다.

커버링 인덱스

  • 조회를 위해 사용되는 컬럼(조회 프로젝션, 조건절, 그룹화 등)이 모두 인덱스로 등록되어 있을 때 빠르게 조회가 가능한 인덱스이다.
  • Inno DB의 세컨더리 인덱스 저장 구조는 리프 노드에 데이터의 주소가 아닌 PK 값이 저장되어 있다.
  • 이로 인해 데이터에 직접 접근하지 않고 인덱스만으로 조회가 가능하다.

상세 내용

  1. role id 를 추가하고 query dsl 을 적용

@Repository
public class RoleEntityRepositoryImpl implements RoleEntityRepository {

    private List<Long> findRoleHistoryIdsGroupByAndOrderBy(Long roleId) {
        return jpaQueryFactory.select(roleHistory.id.max())
                .from(roleHistory)
                .groupBy(roleHistory.date)
                .orderBy(roleHistory.date.desc())
                .where(roleHistory.roleId.eq(roleId))
                .fetch();
    }

    private List<RoleHistory> findAllRoleHistory(List<Long> ids) {
        return jpaQueryFactory.selectFrom(roleHistory)
                .from(roleHistory)
                .where(roleHistory.id.in(ids))
                .fetch();
    }
}
  1. date 컬럼을 추가하고 복합 인덱스를 생성하여 커버링 인덱스를 적용

image