쿼리가 lever
인덱스 추가 전에 물어: 쿼리가 DB 에게 너무 많이 시키나? 세 컬럼만 필요한데 SELECT *, 실제 안 쓰는 테이블 join, 순서 무관한데 LIMIT 전 ORDER BY — 다 인덱스가 못 고치는 쿼리-모양 문제.
고전적 모양 문제
- 안 쓰는 컬럼 선택 (추가 IO, covering 인덱스 무력화).
- 필터 또는 선택 안 하는 테이블 join.
- 나중에 aggregate 가능한데 먼저 aggregate.
- 캐시 가능한 비싼 표현식을 SELECT 리스트에서 계산.
- '맞는 거 찾으려' 1만 행을 앱으로 가져오기 — DB 가 필터하게.
최적화 올바른 순서
- 쿼리 모양 수정 — 컬럼 좁히기, 행 좁히기, SQL 으로 작업 push.
- 그 다음 인덱스 추가 — EXPLAIN 이 여전히 문제 보이면.
- 그 다음 캐시 추가 — 데이터 자주 read + 거의 안 변할 때만.
- 그 다음 materialised view 추가 — aggregation 이 진짜 비쌀 때만.