Skip to content

쿼리 성능 개선 ‐ 템플릿 검색

Moly edited this page Oct 31, 2024 · 10 revisions

단계별로 개선한 쿼리 평균 속도

image

최종: 26s -> 5s 개선

검색 API 에서 실행되는 쿼리

검색 API 요청 시 다음 4가지 쿼리 메서드 실행

  • TemplateJpaRepository.findAll()
    • "템플릿" 조회하면서 "카테고리" 조회 쿼리에서 N + 1
  • TemplateTagJpaRepository.findAllByTemplate()
    • 각 템플릿마다 조회
    • "템플릿 태그" 조회하면서 "태그" 조회 쿼리에서 N + 1
  • ThumbnailJpaRepository.fetchByTemplate()
    • 각 템플릿마다 조회
    • "썸네일" 조회하면서 "소스코드" 조회 쿼리에서 N + 1
  • MemberJpaRepository.fetchByTemplateId()
    • 템플릿의 작성자 멤버 조회
    • 불필요한 로직

총 템플릿 갯수가 N, 총 카테고리 갯수가 C, 템플릿 당 평균 태그 T, 템플릿 당 평균 소스코드 SC일 때 다음 갯수만큼 쿼리 실행

-> O(N * (C + T + SC))

1. N + 1 개선하기

카테고리 조회 N + 1 개선하기

개선 전

  • M개의 "템플릿" 별로 "카테고리" 1번 조회
image

태그 조회 N + 1 개선하기

TemplateTagJpaRepository.findAllByTemplate() -> TemplateTag(1) + Tag(N)

개선 전

  • M개의 "템플릿" 별로 "템플릿 태그" 1번 조회
  • 조회한 N개의 "템플릿 태그" 별로 "태그" 조회
image

fetch join 적용 후

@Query("""
        SELECT tt, t
        FROM TemplateTag tt
        JOIN FETCH tt.tag t
        WHERE tt.id.templateId = :templateId
        """)
List<TemplateTag> findAllByTemplate(Template template);
image

썸네일 조회 개선하기

개선 전

image

fetch join 적용 후

@Query("""
        SELECT t, sc
        FROM Thumbnail t
        join fetch t.sourceCode sc
        WHERE t.template = :template
        """)
image

2. 로직으로 개선하기

  • Template 들의 TemplateTag를 List로 가져오기
  • Template 들의 Thumbnail를 List로 가져오기

개선 전

개선 후

3. 전문 검색 인덱스 걸기

ALTER TABLE template ADD FULLTEXT INDEX idx_template_fulltext (title, description);
ALTER TABLE source_code ADD FULLTEXT INDEX idx_source_code_fulltext (content, filename);
``

⚡️ 코드zap

프로젝트

규칙 및 정책

공통

백엔드

프론트엔드

매뉴얼

백엔드

기술 문서

백엔드

프론트엔드

회의록


Clone this wiki locally