Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL EXPLAIN 완벽 가이드: 쿼리 실행 계획 확인 및 인덱스 최적화 방법

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으로 실행 계획을 점검하는 습관을 들이는 것이 성능 최적화의 핵심입니다.