데이터베이스 쿼리 최적화는 애플리케이션 성능을 극대화하는 데 중요한 역할을 한다.
잘못 작성된 쿼리는 성능 저하를 초래할 수 있으며, 특히 대규모 데이터셋을 처리할 때 더욱 그렇다.
MySQL의 EXPLAIN 명령어는 쿼리 실행 계획을 분석하고 최적화할 수 있는 강력한 도구이다.
이번 글에서는 EXPLAIN 명령어의 개념과 사용법, 쿼리 최적화 방법을 살펴보려고 한다.
EXPLAIN 명령어는 MySQL에서 쿼리 실행 계획을 보여주는 도구이다.
쿼리가 실행될 때 MySQL이 사용하는 접근 방법과 조인 방식, 그리고 인덱스 사용 여부 등을 설명해준다.
이를 통해 쿼리 성능을 분석하고, 비효율적인 부분을 식별하여 최적화할 수 있다.
EXPLAIN 명령어는 SELECT 쿼리 앞에 추가하여 실행 계획을 확인할 수 있다.
EXPLAIN SELECT * FROM employees WHERE department = 'Sales';
위 쿼리는 employees 테이블에서 department가 'Sales'인 레코드를 조회하는 쿼리의 실행 계획을 보여준다.
EXPLAIN 명령어의 출력 결과는 여러 열(column)로 구성되며,
각 열은 쿼리 실행 계획의 특정 부분을 설명한다.
적절한 인덱스 사용
인덱스는 쿼리 성능을 크게 향상시킬 수 있는 중요한 요소이다.
EXPLAIN 명령어를 통해 인덱스가 적절히 사용되지 않는 경우,
인덱스를 추가하거나 기존 인덱스를 수정하여 성능을 개선할 수 있다.
CREATE INDEX idx_department ON employees(department);
위 예제는 department 컬럼에 인덱스를 생성하여, 해당 컬럼을 기준으로 한 검색 성능을 향상시킨다.
조인 최적화
복잡한 조인 쿼리에서는 조인 순서와 방식이 중요하다. EXPLAIN을 통해 조인 계획을 확인하고, 필요한 경우 쿼리를 재작성하거나 인덱스를 추가하여 성능을 개선할 수 있다
EXPLAIN SELECT e.name, d.name
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE e.salary > 50000;
위 쿼리는 employees 테이블과 departments 테이블을 조인하여,
salary가 50000 이상인 직원과 그들의 부서를 조회한다.
서브쿼리 최적화
서브쿼리는 성능을 저하시키는 원인이 될 수 있다. 가능하다면 서브쿼리를 JOIN으로 변경하여 성능을 개선할 수 있다.
-- 서브쿼리 사용 예제
EXPLAIN SELECT name
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'New York');
-- JOIN 사용 예제
EXPLAIN SELECT e.name
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE d.location = 'New York';
JOIN을 사용한 쿼리는 서브쿼리보다 성능이 우수할 수 있다.
LIMIT 사용
대량의 데이터를 조회할 때는 LIMIT 절을 사용하여 필요한 데이터만 조회하도록 한다. 이는 쿼리 성능을 개선하고, 불필요한 데이터를 처리하는 비용을 줄일 수 있다.
EXPLAIN SELECT * FROM employees ORDER BY hire_date DESC LIMIT 10;
위 쿼리는 최근 입사한 10명의 직원 정보를 조회한다.