PE Notes · DB
데이터베이스 튜닝
쿼리·인덱스·스키마·인스턴스 순의 튜닝 계층과 실행 계획, 선택도·커버링 인덱스, 버퍼·슬로우 쿼리 지표를 정리합니다.
앱이 느릴 때 원인은 종종 DB에 있습니다. 데이터가 늘고 질의 패턴이 바뀌면, 예전에 맞던 계획도 어긋납니다. 은 응답 시간을 줄이고 처리량을 올리며 자원을 덜 쓰게, 하드웨어를 사기 전에 질의와 스키마와 설정을 다듬는 일입니다.
계층과 순서
효과 대비 비용이 큰 쪽부터 갑니다. 쿼리 → 인덱스 → 스키마(파티션·반정규화) → 인스턴스(메모리·I/O) → 장비입니다.
기준선 없이 힌트를 넣으면 회귀를 모릅니다. 슬로우 로그와 대기 이벤트로 병목을 가리킨 뒤 한 가지를 바꾸고 비교합니다.
쿼리와 인덱스
에서 테이블 풀스캔, 인덱스 스캔, 조인 방식, 불필요 SORT를 봅니다.
| 패턴 | 문제 | 손질 |
|---|---|---|
SELECT * |
불필요 열 전송 | 필요한 열만 |
| 컬럼에 함수 | 인덱스 무효 | 저장 시 정규화 |
| 앞 와일드카드 LIKE | 인덱스 스킵 | 전문 검색 |
| NOT IN / != | 범위 활용 어려움 | IN, EXISTS |
| 상관 서브쿼리 | 반복 실행 | JOIN, CTE |
| 습관적 DISTINCT | 정렬 비용 | 중복 원인 제거 |
인덱스는 가 좋은(값이 다양한) 열을 복합 키 앞에 둡니다. 는 질의에 필요한 열이 인덱스에 다 있어 본표를 안 봅니다. 클러스터드는 데이터 순서가 인덱스와 같습니다. 성별처럼 값이 두어 개이거나, 쓰기가 읽기를 압도하면 인덱스를 늘리지 않습니다. 조각난 인덱스는 재구성합니다.
스키마 단에서는 범위 파티션과 프루닝, 자주 조인하는 경로의 반정규화를 검토합니다.
인스턴스와 지표
버퍼 풀은 데이터·인덱스를 메모리에 남겨 디스크를 줄입니다. 연결 수는 풀 크기와 맞추고, 리두 로그가 커지면 I/O는 편해지나 회복은 길어집니다.
| 지표 | 보는 것 |
|---|---|
| 응답 시간 | 질의 시작~반환 |
| 처리량(TPS) | 단위 시간 트랜잭션 |
| 버퍼 히트율 | 디스크 없이 처리한 비율. 높은 편이 목표 |
| 슬로우 쿼리 비율 | 기준 시간 초과 |
| 잠금 대기 | 경합 |
| CPU·I/O | 자원 천장 |
자율 튜닝과 읽기 복제 자동 분산은 운영을 덜어 주지만, 실행 계획을 읽는 일은 남습니다.