[DB] SQL 성능 튜닝

cowmin·2025년 6월 16일

1. SQL 성능 튜닝이란?

데이터베이스 쿼리의 실행 속도와 자원 사용량을 최적화하는 작업

SQL 성능이 중요한 이유

  • 대량의 데이터에서 빠르게 원하는 정보를 찾기 위해
  • 사용자 요청을 지연 없이 처리하기 위해
  • 서버 자원(CPU, Memory, Disk I/O 등)을 효율적으로 쓰기 위해
  • 트래픽이 몰리는 상황에서도 서비스 안정성을 유지하기 위해

2. 주요 성능 튜닝 대상

성능을 좌우하는 핵심 요소들로, 잘 설계하면 성능이 좋아지고, 잘못 쓰면 성능이 나빠짐

2.1 인덱스

  • 가장 강력한 성능 개선 도구
  • 잘 쓰면 엄청 빠르지만, 남발하면 INSERT/UPDATE 성능 떨어뜨림

2.2 LIMIT

불필요한 대량 데이터 조회를 막고, 필요한 만큼만 가져오기

2.3 WHERE

조건을 명확히 줘서 불필요한 row를 피하도록 설계

2.4 JOIN

  • 무분별한 조인 → 성능 저하
  • 조인 전에 각 테이블이 얼마나 걸리는지 개별 실행 후 확인
  • 조인 키에는 반드시 인덱스 부여

2.5 서브쿼리

간결하지만 중첩되면 느려짐, JOIN으로 바꾸면 나아짐

2.6 ORDER BY / GROUP BY

  • 중복 제거는 많은 자원을 씀 → 꼭 필요한 경우만 사용

3. 성능 분석 도구

3.1 EXPLAIN

SQL 실행 계획 분석

항목의미
idSELECT 문에 대한 고유 ID
select_type쿼리의 타입(SIMPLE, PRIMARY, SUBQUERY 등)
table조회 대상 테이블 이름
type조인 방식 또는 접근 방식
possible_keys사용 가능한 인덱스 목록
key사용한 인덱스
key_len사용된 인덱스의 길이 (bytes)
ref어떤 속성을 기준으로 인덱스가 사용되었는지 표시
rowsMySQL이 예측한 스캔할 행의 수
Extra추가 정보

3.2 SHOW PROFILE

각 단계별 실행 시간 분석

3.3 SHOW STATUS

서버 상태 및 실행 통계 확인

3.4 performance_schema

MySQL 내부 성능 측정용 DB

3.5 slow query log

오래 걸리는 쿼리 기록 (로그 기반 튜닝)

SET profiling = 1;			# 프로파일링 기능을 켬
SHOW PROFILES;				# 실행했던 SQL의 실행 시간 표시
SELECT * FROM member;	
SHOW PROFILE FOR QUERY 6;	# 특정 쿼리 상세 조회



EXPLAIN SELECT * FROM member;	# SQL 실행 계획 표시
# SELECT 쿼리를 실행하기 전에 MySQL이 어떤 식으로 데이터를 가져올지를 보여줌

-- member 테이블 구조 확인
DESC member;

-- 쿼리 실행 예시 및 성능 확인
SELECT * FROM member;

테이블의 전체 데이터를 조회
인덱스 없이 전체 테이블을 순회하게 되므로 비효율적일 수 있음

EXPLAIN SELECT * FROM member WHERE idx=1;
idx는 AUTO_INCREMENT이므로 기본키(PK)로 설정되어 있을 가능성이 큼

이 쿼리는 PK 기반 단건 조회 → 매우 빠르고 효율적

EXPLAIN SELECT * FROM member WHERE email='test1';
email 컬럼에는 인덱스가 아직 없을 수도 있음

이 경우 type = ALL (전체 탐색)이 나오며 성능이 떨어짐

SELECT * FROM member WHERE idx=1;
SELECT * FROM member WHERE email='test1';

SELECT * FROM member WHERE idx=1128;

# 인덱스 생성하는 법
CREATE INDEX member_index_email ON member(email);

3.5 인덱스 실습

-- post 테이블 생성
CREATE TABLE post (
    idx INT AUTO_INCREMENT PRIMARY KEY,
    writerIdx INT,
    contents VARCHAR(100),
    createdAt DATETIME,
    FOREIGN KEY (writerIdx) REFERENCES member(idx)
);

    테이블 생성
    데이터 삽입
    EXPLAIN 및 PROFILE 로  SELECT 성능 체크
    인덱스 생성 
    EXPLAIN 및 PROFILE 로  SELECT 성능 체크

0개의 댓글