티스토리 뷰
본 포스팅은 아래 링크의 글을 읽고 난 뒤 참고사항을 정리한 것입니다.
인덱스의 적절한 사용
- 인덱스가 적용이 안된 경우 성능 부하를 줄 수 있다.(쿼리 처리 지연 → 커넥션 고갈 → 요청이 대기상태로 빠짐 → 프로세스 강제 종료) → 인덱스 적용
테이블 컬럼을 변조하거나 부정조건 사용으로 인덱스를 사용할 수 없게 됨
- 테이블의 컬럼을 변조(
lower(”컬럼명”)=lower(쿼리파라미터”)
)하거나 부정조건(≠
,NOT IN
) 등 인덱스를 사용할 수 없는 쿼리들로 되어 있었음 → 테이블 풀 스캔 쿼리가 동시에 수십 ~ 수백개 발생 → 인덱스를 추가하거나 쿼리를 변경하여 인덱스를 사용하도록 개선
select *
로 사용하지 않는 대용량 컬럼 조회
- 사용하지 않는 대용량 컬럼들도 조회되어 READ IO 병목 발생 → 사용하지 않는 컬럼 모두 제거
IN에 요소 100개 초과
- where id in (ID)에 포함되는 ID 개수가 100개를 초과 → 인덱스 사용할 수 X됨 → 테이블 풀 스캔 → IN 절에 담는 ID를 20개씩으로 끊어서 Promise.all로 분할처리하도록 구성하여 IN절을 통한 인덱스 효과를 다시 사용할 수 있도록 함
- 🔗 MySQL IN절을 통한 성능 개선 방법 참고
- 👨🏻🏫 `eq_range_index_dive_limit` 옵션으로 인해서 실행 계획 선택 방식이 IN절 개수에 따라 달라진다. 기본적으로 기준값(MySQL 5.6 : 10, MySQL 5.7.4 : 200)을 초과할 경우, `index dive` 방식이 아니라 인덱스 통계 정보를 바탕으로 실행계획을 세울 수 있도록 하는 `index statistics`를 사용한다.
쿼리 타임아웃 설정
- 5초 이상 수행되는 쿼리 강제 종료 → 사전에 Long Query 차단
(PostgreSQL 특성)과한 Dead Tuple 발생에 따른 디스크 I/O 증가
- 수강생이 강의 등록시 수강생 수 항목을 +1시키는 Update 쿼리 항상 수행 → PostgreSQL은 기존의 다른 RDBMS처럼 UPDATE, DELETE한다고 해서 실제 데이터를 수정하거나 삭제하지 않고 변경되었다는 표시를 남기고 새로운 데이터 기록 → 잦은 UPDATE, DELETE, Transaction 이벤트로 고용량의 Dead Tuple 대량 생산 → 기존의 다른 기능들의 영향도를 파악해서 수강생수 컬럼을 분리하기보다는 강의 소개 컬럼을 분리하는 것을 선택
300x250
'공부흔적' 카테고리의 다른 글
SVN 체크아웃 후 프로젝트 실행까지 발생한 문제 해결 (0) | 2022.02.14 |
---|---|
sessionStorage (0) | 2022.02.02 |
DRM과 파일 업로드 (0) | 2022.01.27 |
POI 라이브러리와 엑셀파일 확장자 (0) | 2022.01.27 |
로그와 보안 (0) | 2022.01.27 |