MySQL에서 EXPLAIN 키워드를 사용하면 SELECT 쿼리가 실제로 어떻게 실행되는지, 즉 인덱스를 사용하는지, 몇 개의 행을 검사하는지 등의 실행 계획(Execution Plan)을 미리 확인할 수 있습니다. 쿼리 성능을 분석하고 최적화할 때 매우 유용한 도구입니다.
1. 샘플 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1541
-> (
-> EmployeeId int,
-> EmployeeFirstName varchar(20) NOT NULL
-> );
Query OK, 0 rows affected (0.94 sec)
2. 컬럼에 인덱스 생성하기
다음으로 EmployeeFirstName 컬럼에 인덱스를 생성합니다. 인덱스가 있어야 EXPLAIN 결과에서 인덱스 활용 여부를 확인할 수 있습니다.
mysql> create index emp_name_index on DemoTable1541(EmployeeFirstName);
Query OK, 0 rows affected (0.75 sec)
Records: 0 Duplicates: 0 Warnings: 0
3. 데이터 삽입하기
INSERT 명령을 사용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable1541 values(1,'Robert');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1541 values(2,'Adam');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1541 values(3,'Mike');
Query OK, 1 row affected (0.14 sec)
4. 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1541;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------------+-------------------+
| EmployeeId | EmployeeFirstName |
+------------+-------------------+
| 1 | Robert |
| 2 | Adam |
| 3 | Mike |
+------------+-------------------+
3 rows in set (0.00 sec)
5. EXPLAIN으로 실행 계획 확인하기
이제 SELECT 쿼리 앞에 EXPLAIN 키워드를 붙여 실행 계획을 조회합니다.
mysql> explain select * from DemoTable1541 where EmployeeFirstName='Mike';
실행 결과는 다음과 같습니다.
+----+-------------+---------------+------------+------+----------------+----------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------+------------+------+----------------+----------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | DemoTable1541 | NULL | ref | emp_name_index | emp_name_index | 62 | const | 1 | 100.00 | NULL |
+----+-------------+---------------+------------+------+----------------+----------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
EXPLAIN 결과 해석하기
출력된 각 컬럼의 의미는 다음과 같습니다.
- select_type: SIMPLE은 서브쿼리나 UNION 없는 단순 쿼리를 의미합니다.
- type: ref 값은 인덱스를 사용해 조건에 일치하는 행만 읽었음을 나타냅니다. 만약 ALL이라면 전체 테이블 스캔(Full Table Scan)이 발생한 것이므로 성능 개선이 필요합니다.
- possible_keys: 쿼리에서 사용할 수 있는 후보 인덱스 목록입니다. 여기서는 emp_name_index입니다.
- key: MySQL 옵티마이저가 실제로 선택한 인덱스입니다. emp_name_index가 사용되었습니다.
- key_len: 사용된 인덱스의 길이(바이트)입니다.
- rows: 쿼리를 처리하기 위해 검사해야 하는 예상 행 수입니다. 이 예제에서는 1행만 검사하면 됩니다.
- filtered: 조건에 일치할 것으로 예상되는 행의 비율로, 100.00%는 모든 검사 행이 조건에 부합함을 의미합니다.
이처럼 EXPLAIN을 활용하면 쿼리가 인덱스를 제대로 활용하는지 진단할 수 있으며, 느린 쿼리의 원인을 파악하고 최적화 방향을 결정하는 데 큰 도움이 됩니다.