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

MySQL EXPLAIN 키워드로 쿼리 실행 계획 확인하는 방법

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을 활용하면 쿼리가 인덱스를 제대로 활용하는지 진단할 수 있으며, 느린 쿼리의 원인을 파악하고 최적화 방향을 결정하는 데 큰 도움이 됩니다.