느린 쿼리 최적화는 실행 계획 분석(EXPLAIN)으로 병목을 찾는 데서 시작하여, 표적화된 수정을 적용합니다 — 가장 흔하게는 index 추가, 쿼리 재작성, 흔한 안티패턴 회피입니다. 가장 큰 효과는 보통 full table scan을 index 조회로 바꾸는 것입니다.
1단계: EXPLAIN으로 분석
EXPLAIN ANALYZE
orders customer_id ;
느린 쿼리 최적화는 실행 계획 분석(EXPLAIN)으로 병목을 찾는 데서 시작하여, 표적화된 수정을 적용합니다 — 가장 흔하게는 index 추가, 쿼리 재작성, 흔한 안티패턴 회피입니다. 가장 큰 효과는 보통 full table scan을 index 조회로 바꾸는 것입니다.
EXPLAIN ANALYZE
orders customer_id ;
EXPLAIN(또는 EXPLAIN ANALYZE)은 데이터베이스가 쿼리를 어떻게 실행하는지 보여줍니다 — 결정적으로, full table scan(느림)을 하는지 index(빠름)를 쓰는지를 보여줍니다. 최적화 전에 항상 프로파일링하세요.
-- EXPLAIN이 필터링/join되는 컬럼에 Seq Scan을 보이면 → index 추가
CREATE INDEX idx_orders_customer ON orders(customer_id);
-- full scan을 빠른 index 조회로 바꿈
가장 흔하고 영향력 큰 수정: WHERE, JOIN, ORDER BY에 쓰이는 컬럼에 index 추가. 이는 full table scan을 빠른 조회로 바꿉니다.
-- ❌ 컬럼에 함수를 적용하면 index 사용을 막음
WHERE UPPER(email) = '[email protected]' -- email index를 쓸 수 없음
WHERE email = '[email protected]' -- ✅ index를 쓸 수 있음
-- ❌ 선행 와일드카드 LIKE는 index를 쓸 수 없음
WHERE name LIKE '%smith' -- ✅ 'smith%' (prefix)는 index를 쓸 수 있음
-- ❌ SELECT *는 불필요한 컬럼을 가져옴
SELECT * → SELECT 필요한_컬럼만 -- 데이터 적음, covering index를 쓸 수 있음
-- ❌ N+1 쿼리 (반복문에서 쿼리) → 단일 JOIN을 대신 사용
✓ N+1 쿼리 수정 (행마다 한 쿼리) → JOIN 사용 / 단일 쿼리로 배치
✓ 적절한 index 추가 (다중 컬럼 필터에는 COMPOSITE 포함)
✓ 스캔되는 데이터 줄이기 — 일찍 필터링, 필요한 컬럼만 선택, 페이지네이션
✓ 더 효율적인 경우 서브쿼리를 JOIN으로 재작성
✓ 큰 서브쿼리의 존재 확인에는 IN 대신 EXISTS 사용
✓ 통계를 최신으로 유지 (ANALYZE) — 플래너가 좋은 선택을 하도록
✓ 비싼 반복 쿼리에는 비정규화 / materialized view 고려
✓ FOREIGN KEY의 누락된 index 주의 (없으면 join이 스캔함)
쿼리 최적화는 데이터베이스 성능에 결정적인 지식입니다 — 느린 쿼리는 나쁜 애플리케이션 성능의 주요 원인이며, 이를 찾고 고치는 법을 이해하는 것은 대규모 데이터베이스를 다루는 누구에게나 필수적인 시니어 수준 역량입니다.
기초적인 규율은 추측이 아니라 최적화 전에 EXPLAIN으로 분석하는 것입니다(실행 계획을 검토해 실제 병목을 찾기 — 결정적으로 쿼리가 느린 full table scan을 하는지 빠른 index 조회를 하는지) — 이 측정 기반 접근이 최적화를 효과적으로 만듭니다.
가장 크고 흔한 효과는 index 추가입니다(필터링, join, 정렬되는 컬럼에 — full table scan을 빠른 조회로 바꿔 쿼리 시간을 종종 수십 배 개선), index 지식을 최적화의 중심으로 만듭니다.
흔한 안티패턴을 이해하는 것도 똑같이 중요합니다: 컬럼에 함수 적용과 선행 와일드카드 LIKE는 index 사용을 막고, SELECT *는 불필요한 데이터를 가져오며, 특히 N+1 쿼리(단일 JOIN 대신 반복문에서 쿼리 — 애플리케이션 코드에서 빈번하고 심각한 성능 킬러) — 이를 인식하고 고치는 것이 느린 쿼리의 가장 흔한 원인을 해결합니다.
기타 기법(composite index, 스캔 데이터 줄이기, 서브쿼리를 JOIN으로 재작성, 통계 최신 유지, 비싼 쿼리용 materialized view)이 도구 모음을 완성합니다.
쿼리 성능은 애플리케이션 반응성과 확장성에 직접 영향을 주고, 체계적 접근(EXPLAIN으로 분석한 뒤 수정 — 보통 index 추가와 N+1 같은 안티패턴 제거)이 부하 속에서 데이터베이스를 빠르게 유지하므로, 쿼리 최적화를 숙달하는 것은 성능 좋고 확장 가능한 데이터베이스 기반 애플리케이션을 구축할 수 있는 개발자를 구별하는 중요하고 가치 높은 시니어 지식입니다 — 자주 관련되는 결정적 역량이자 데이터베이스 성능에 관한 흔한 인터뷰 주제입니다.