MySQL EXPLAIN이란?
MySQL의 EXPLAIN은 쿼리가 데이터베이스에서 어떻게 실행될지 보여주는 실행 계획(Execution Plan)을 확인할 수 있는 강력한 도구입니다. EXPLAIN은 SELECT, INSERT, DELETE, REPLACE, UPDATE 문 앞에 붙여서 사용할 수 있으며, 쿼리 성능을 분석하고 최적화하는 데 필수적인 기능입니다.
데이터베이스에서 풀 테이블 스캔(Full Table Scan)을 피하려면 인덱스를 적절히 사용해야 합니다. 아래 예제를 통해 인덱스 생성 전후로 EXPLAIN 결과가 어떻게 달라지는지 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1488
-> (
-> StudentId int,
-> StudentName varchar(20),
-> StudentAge int
-> );
Query OK, 0 rows affected (2.18 sec)
2. 인덱스 생성하기
다음으로 StudentId 컬럼에 인덱스를 생성합니다.
mysql> create index student_id_index on DemoTable1488(StudentId);
Query OK, 0 rows affected (0.90 sec)
Records: 0 Duplicates: 0 Warnings: 0
3. 레코드 삽입하기
INSERT 명령어를 사용해 테이블에 샘플 데이터를 입력합니다.
mysql> insert into DemoTable1488 values(101,'Sam',21);
Query OK, 1 row affected (0.32 sec)
mysql> insert into DemoTable1488 values(102,'Bob',23);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1488 values(103,'David',20);
Query OK, 1 row affected (0.21 sec)
4. 저장된 데이터 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1488;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-----------+-------------+------------+
| StudentId | StudentName | StudentAge |
+-----------+-------------+------------+
| 101 | Sam | 21 |
| 102 | Bob | 23 |
| 103 | David | 20 |
+-----------+-------------+------------+
3 rows in set (0.00 sec)
5. EXPLAIN으로 실행 계획 분석하기
이제 EXPLAIN을 사용해 WHERE 조건이 포함된 쿼리의 실행 계획을 확인합니다.
mysql> explain select * from DemoTable1488 where StudentId=1;
실행 결과는 다음과 같습니다.
+----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | DemoTable1488 | NULL | ref | student_id_index | student_id_index | 5 | const | 1 | 100.00 | NULL |
+----+-------------+---------------+------------+------+------------------+------------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
EXPLAIN 결과 해석하기
출력된 실행 계획의 주요 컬럼을 살펴보면 다음과 같습니다.
- type: ref — 인덱스를 통해 일치하는 행만 조회했음을 의미합니다. 만약 인덱스가 없었다면
ALL(풀 테이블 스캔)로 표시됩니다. - possible_keys / key: student_id_index — 사용 가능한 후보 인덱스와 실제로 선택된 인덱스가 모두
student_id_index임을 보여줍니다. - rows: 1 — MySQL이 검색해야 할 것으로 예상하는 행 수입니다. 인덱스 덕분에 단 1개의 행만 검사하면 됩니다.
- filtered: 100.00 — 조건에 해당하는 행의 비율을 나타냅니다.
이처럼 EXPLAIN을 활용하면 쿼리가 인덱스를 제대로 활용하는지, 불필요한 풀 테이블 스캔이 발생하지 않는지 손쉽게 진단할 수 있습니다. 대용량 데이터를 다루는 환경에서는 쿼리 작성 후 반드시 EXPLAIN으로 실행 계획을 점검하는 습관을 들이는 것이 성능 최적화의 핵심입니다.