-
Notifications
You must be signed in to change notification settings - Fork 8
Query Performance Improvement Template Update
정회성 edited this page Oct 29, 2024
·
3 revisions
- Members: 10 entries
- Categories: 100 entries (10 entries per member)
- Tags: 2000 entries (200 entries per member)
- Templates: 100,000 entries (10,000 entries per member)
- Source Codes: 100,000 to 500,000 entries (1 to 5 random generated per template)
- Execute 100 times with 10 threads
- Total of 1000 requests executed
- Tags used: 10
- Source Codes: 5 -> 5 (1 code modified / 2 codes created / 2 codes deleted)
- Total request count: 1000
- Total elapsed time: 75215ms
- Average elapsed time: 75ms
-
Repository:
CategoryJpaRepository
-
Method:
fetchById
SELECT
c1_0.id,
c1_0.created_at,
c1_0.is_default,
c1_0.member_id,
m1_0.id,
m1_0.created_at,
m1_0.modified_at,
m1_0.name,
m1_0.password,
m1_0.salt,
c1_0.modified_at,
c1_0.name
FROM
category c1_0
JOIN member m1_0 ON m1_0.id=c1_0.member_id
WHERE
c1_0.id=?
- Call Count: 1
-
Repository:
TemplateJpaRepository
-
Method:
fetchById
SELECT
t1_0.id,
t1_0.category_id,
t1_0.created_at,
t1_0.description,
(SELECT COUNT(*) FROM likes WHERE likes.template_id = t1_0.id),
t1_0.member_id,
t1_0.modified_at,
t1_0.title
FROM
template t1_0
WHERE
t1_0.id=?
- Call Count: 1
-
Repository:
TemplateTagRepository
-
Method:
deleteAllByTemplateId
SELECT
tt1_0.tag_id,
tt1_0.template_id,
tt1_0.created_at,
tt1_0.modified_at
FROM
template_tag tt1_0
WHERE
tt1_0.template_id=?
- Call Count: 1
SELECT
t1_0.id,
t1_0.created_at,
t1_0.modified_at,
t1_0.name
FROM
tag t1_0
WHERE
t1_0.id=?
- Call Count: (Number of tags stored in the template)
-
Repository:
TagJpaRepository
-
Method:
findNameByNamesIn
SELECT
t1_0.name
FROM
tag t1_0
WHERE
t1_0.name IN (?, ?, ?, ?, ?)
- Call Count: 1
-
Repository:
TagRepository
-
Method:
fetchByName
SELECT
t1_0.id,
t1_0.created_at,
t1_0.modified_at,
t1_0.name
FROM
tag t1_0
WHERE
t1_0.name=?
- Call Count: (Number of existing tags from the total tags)
- The domain update query is sent late.
UPDATE
template
SET
category_id=?,
description=?,
member_id=?,
modified_at=?,
title=?
WHERE
id=?
- Call Count: 1
DELETE
FROM
template_tag
WHERE
tag_id=?
AND template_id=?
- Call Count: (Number of tags stored in the template)
SELECT
tt1_0.tag_id,
tt1_0.template_id,
tt1_0.created_at,
tt1_0.modified_at,
t1_0.id,
t1_0.created_at,
t1_0.modified_at,
t1_0.name,
t2_0.id,
t2_0.category_id,
t2_0.created_at,
t2_0.description,
(SELECT COUNT(*) FROM likes WHERE likes.template_id = t2_0.id),
t2_0.member_id,
t2_0.modified_at,
t2_0.title
FROM
template_tag tt1_0
JOIN tag t1_0 ON t1_0.id=tt1_0.tag_id
JOIN template t2_0 ON t2_0.id=tt1_0.template_id
WHERE
(tt1_0.tag_id, tt1_0.template_id) IN ((?, ?))
- Call Count: (Number of tags stored in the template)
SELECT
t1_0.id,
t1_0.created_at,
t1_0.modified_at,
t1_0.source_code_id,
t1_0.template_id
FROM
thumbnail t1_0
WHERE
t1_0.template_id=?
SELECT
sc1_0.id,
sc1_0.content,
sc1_0.created_at,
sc1_0.filename,
sc1_0.modified_at,
sc1_0.ordinal,
sc1_0.template_id
FROM
source_code sc1_0
WHERE
sc1_0.id=?
- Call Count: 1
SELECT
sc1_0.id,
sc1_0.content,
sc1_0.created_at,
sc1_0.filename,
sc1_0.modified_at,
sc1_0.ordinal,
sc1_0.template_id
FROM
source_code sc1_0
WHERE
sc1_0.id=?
- Call Count: 1
INSERT
INTO
template_tag
(created_at, modified_at, tag_id, template_id)
VALUES
(?, ?, ?, ?)
- Call Count: (Number of tags used)
INSERT
INTO
source_code
(content, created_at, filename, modified_at, ordinal, template_id)
VALUES
(?, ?, ?, ?, ?, ?)
- Call Count: (New source codes)
SELECT
sc1_0.id,
sc1_0.content,
sc1_0.created_at,
sc1_0.filename,
sc1_0.modified_at,
sc1_0.ordinal,
sc1_0.template_id
FROM
source_code sc1_0
WHERE
sc1_0.id=?
- Call Count: (Source codes to be deleted)
UPDATE
source_code
SET
content=?,
filename=?,
modified_at=?,
ordinal=?,
template_id=?
WHERE
id=?
- Call Count: (Source codes to be updated)
DELETE
FROM
source_code
WHERE
id=?
- Call Count: (Source codes to be deleted)
SELECT
COUNT(sc1_0.id)
FROM
source_code sc1_0
WHERE
sc1_0.template_id=?
- Call Count: 1
-
Index Suggestion:
-
name
- Reason: Tags to be used in the template are queried by name.
-
Additional: Yes,
CREATE INDEX idx_tag_name ON tag(name);
-
as-is
Existing tags are retrieved by name in `
tag. As this operation does not require data and is only for modification, the
name` field is used.
to-be
If there are existing tags to be connected to the template, they can be added to template_tag
.
- Instead of retrieving existing tags, check if the tag already exists and, if not, add it to
tag
. - After that, you can add it to
template_tag
.
- A performance improvement plan was prepared for the template modification process in the template registration function of the template service.
- The performance test results indicated that the average processing time for 1000 requests was 75ms.
- Query execution was analyzed, and it was confirmed that excessive queries were being executed, especially when retrieving existing tags.
- An index was recommended for the
tag
table to reduce search time for tag names, and the logic for creatingtemplate_tag
was proposed to avoid redundant queries.
- 백엔드 코드 컨벤션
- 백엔드 기술 스택 및 선정 이유
- 각종 인스턴스 설정 파일 및 구성 위치 가이드
- ERD (24.09.27)
- 백엔드 CI CD 동작 프로세스
- 로컬 DB 환경 설정
- 백엔드 로깅 전략
- 백엔드 로그 모니터링 구성도
- 스프링 메트릭 모니터링 구성도
- Flyway 로 스키마 관리
- 코드잽 서버 구성도
- Git Submodule 사용 메뉴얼
- 프론트엔드 코드 컨벤션
- 프론트엔드 기술 스택 및 선정 이유
- 프론트엔드 서비스 타겟 환경 및 브라우저 지원 범위 선정
- 프론트엔드 모니터링 및 디버깅 환경 구축
- 프론트엔드 테스트 목록
- 프론트엔드 라이브러리 기술 검토
- 프론트엔드 개발서버, 운영서버 빌드 및 배포 환경 구분
- 목표했던 타겟 환경과 디바이스에서 서비스 핵심 기능 동작 확인
- 프론트엔드 접근성 개선 보고서
- EC2 로그 확인 방법
- VSCode를 통한 EC2 인스턴스 SSH 연결 방법
- 터미널을 통한 EC2 인스턴스 SSH 연결 방법
- NGINX 설정 파일 접근 및 적용 방법
- DB 접속 및 백업 방법
- [QA] 배포 전 체크리스트
- CI 파이프라인 구축
- CD 파이프라인 구축
- 백엔드 CI CD 트러블슈팅
- Lombok Annotation Processor 의존성을 추가한 이유
- 2차 스프린트 기준 ERD
- DTO 검증하기
- ProblemDetail
- Fork된 레포지토리 PR에서 CI Secrets 접근 문제 해결
- AWS CloudWatch 모니터링
- 스프링 메트릭 모니터링 구축 방법
- 로깅과 Logback에 대해 알아보아요.
- 백엔드 CD 파이프라인 Ver.2
- 요청, 응답 로그에 correlationId 를 추가하자!
- 3차 스프린트 기준 ERD
- 더미데이터 생성하고 실행하기
- 쿼리 성능 개선 결과
- 테이블별 인덱스 설정 목록
- 사용자 증가 시 발생할 수 있는 문제 상황과 개선 방안
- k6를 사용한 서버 부하 테스트
- 6차 스프린트 기준 ERD
- Query Performance Improvement Results
- 테스트 전략 및 CI 설정
- CI CD 구조
- 배포 전, 로컬에서 로그인 기능 포함 테스트해보는 법
- stylelint 적용기
- 내 작업 브랜치 중간에 Merge된 동료의 작업물을 넣고 싶다면 pull vs rebase
- [TS] Webpack config
- [TS] Webpack 환경에서 MSW v2 이슈
- [TS] webpack에서 react‐router‐dom 적용 안됨
- 2024.07.28 새 기획 회의
- 2024.07.26 2차 데모데이 후 회의
- 2024.07.11 백엔드 논의 좀 할게요
- 2024.07.11 백엔드 ERD 회의
- 2024.07.09 깃 브랜치 전략, PR 템플릿 회의
- 2024.07.03 주제 선정 회의
- 2023.07.03 팀빌딩데이 킥오프 회의
- 2023.08.07 3차 스프린트 중간회고