EXPLAIN이란
MySQL의 EXPLAIN 문은 SELECT(및 UPDATE/DELETE 등) 쿼리를 실제로 실행하지 않고, 옵티마이저가 어떤 순서와 방식으로 테이블에 접근할지 실행 계획을 보여줍니다.
기본 사용법
EXPLAIN SELECT * FROM orders WHERE customer_id = 1024;
결과에서 눈여겨봐야 할 컬럼은 type(접근 방식), key(사용된 인덱스), rows(예상 검사 행 수)입니다. type이 ALL이면 인덱스를 못 타고 풀 테이블 스캔을 하고 있다는 뜻입니다.
슬로우 쿼리 로그 활성화
어떤 쿼리가 느린지 먼저 찾아야 EXPLAIN으로 분석할 수 있습니다.
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 1초 이상 걸리는 쿼리 기록
인덱스 추가로 해결하기
WHERE 절이나 JOIN 조건에 자주 쓰이는 컬럼에 인덱스가 없으면 풀 스캔이 발생합니다.
CREATE INDEX idx_customer_id ON orders (customer_id);
인덱스 추가 후 다시 EXPLAIN을 실행해 type이 ref나 range로 바뀌고 rows 값이 줄었는지 확인합니다.
주의할 점
인덱스를 무분별하게 추가하면 쓰기(INSERT/UPDATE) 성능이 떨어집니다. 실제로 자주 조회되는 컬럼 위주로 최소한만 추가하는 것이 원칙입니다.