EXPLAIN
이라는 명령어를 통해 이 실행 계획을 보여줍니다.
느리다고 생각되는 쿼리 앞에 EXPLAIN
키워드를 붙여 실행해 보세요.EXPLAIN SELECT * FROM users WHERE email = 'student@example.com';
EXPLAIN
의 결과는 조금 복잡해 보이지만, 여기서 우리는 몇 가지 핵심 정보를 얻을 수 있습니다.NULL
이라면, 인덱스를 전혀 사용하지 못하고 있다는 뜻입니다.ALL
이라고 표시된다면, 모든 데이터를 다 뒤져보는 '풀 테이블 스캔'을 했다는 의미이므로 최적화가 시급합니다.
index
, range
, ref
등은 인덱스를 잘 사용했다는 긍정적인 신호입니다.WHERE
절의 조건 컬럼에 인덱스가 있는가?WHERE SUBSTRING(name, 1, 1) = '김'
(인덱스 사용 불가)WHERE name LIKE '김%'
(인덱스 사용 가능)SELECT *
대신 필요한 컬럼만 명시하기 🔗SELECT *
는 모든 컬럼의 데이터를 가져오므로 매우 편리하지만, 성능에는 좋지 않은 영향을 줍니다.SELECT *
를 사용하면 이 기회를 놓치게 됩니다.WHERE
절에서 데이터 범위 좁히기 🔗WHERE
절을 통해 최대한 처리해야 할 데이터의 양을 줄이는 것이 중요합니다.
LIMIT
을 사용하여 가져올 데이터의 수를 제한하는 것도 좋은 방법입니다.먼저EXPLAIN
을 사용하여 해당 쿼리의실행 계획을 분석하겠습니다. 실행 계획을 통해 풀 테이블 스캔이 발생하는지, 인덱스를 적절히 사용하고 있는지 등을 확인합니다. 만약 인덱스를 사용하지 못한다면,WHERE
절이나JOIN
조건에 사용된 컬럼에인덱스를 생성하거나, 인덱스 컬럼에 함수 사용 등인덱스를 방해하는 요소를 제거하겠습니다. 그다음으로는,SELECT *
대신필요한 컬럼만 명시하고,WHERE
절을 더 효율적으로 수정하여 불필요한 데이터 조회를 줄이는 방향으로 쿼리를 개선하겠습니다.
SELECT *
를 사용하는 것이 왜 성능에 좋지 않은가요? 🔗첫째, 불필요한 데이터까지 전송되어네트워크 오버헤드가 발생합니다. 둘째, 데이터베이스 서버가 더 많은 데이터를 처리해야 하므로메모리 사용량이 늘어납니다. 마지막으로, 쿼리에 필요한 모든 컬럼이 인덱스에 포함되어 있을 때 테이블에 접근하지 않고 인덱스만으로 결과를 반환하는'커버링 인덱스'최적화 기회를 사용할 수 없게 만들기 때문입니다.
EXPLAIN
으로 실행 계획을 확인SELECT *
를 피하고, WHERE
절을 잘 활용하여