쿼리 분석
개요
이전에 index에서 다루었듯이 DB의 핵심 엔진인 쿼리 옵티마이저가 쿼리가 가장 효율적으로 수행될 수 있는 경로를 찾고 그 풀이법을 저장한다. 만약 옵티마이저가 판단했을 경우 인덱스를 타지 않는 게 더 좋다고 판단하면 타지 않을 수도 있는 것이다.
따라서 Index를 생성한다고 해서 무조건 타는 것은 아니다.
그럼 어떻게 확인할 수 있을까?
EXPLAIN
내가 실행할 쿼리의 앞에 EXPLAIN을 붙이면 쿼리가 어떤 식로 실행될지 확인해볼 수 있다.
이 명령어를 실행하면 MySQL서버가 어떤 쿼리를 실행할 것인가를 확인해볼 수 있는 명령어다.
예를 들면 다음과 같다.
EXPLAIN 실행 결과
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | club | NULL | const | PRIMARY | PRIMARY | 8 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
해석을 해보면 이렇다
- id : 쿼리 내에서 각각의 SELECT 구문에 대해 할당된 숫자이다.
- select_type : 쿼리의 실행 계획 내에서 사용된 SELECT 구문의 유형을 나타낸다. 위의 경우 간단한 SELECT쿼리라는 것을 의미한다.
- table : 쿼리에서 사용된 테이블의 이름이다.
- partitions 파티션에 대한 정보를 제공한다.
- type: 쿼리에서 사용된 테이블을 어떤 방식으로 접근했는지를 나타낸다. 예제의 경우 const로 나타났고 이는 단일 행에 대한 상수값으로 테이블에 엑세스했다는 것을 의미한다. 보통 PK, Unique인덱스를 이용한 정확한 일치 조회일 때 나타난다.
- possible_keys: 쿼리 내에서 사용될 수 있는 인덱스 목록이다.
- key: 쿼리 실행에 실제로 사용된 인덱스이다. PK값으로 검색했으니 클러스터형 인덱스가 사용되었다.
- key_len : 실제로 사용된 인덱스의 길이를 나타낸다.
- ref: 사용된 인덱스가 어떤 값에 의해 참조되었는지에 대한 정보이다.
- rows: 추정된 검색 결과 집합의 행 수이다.
- filtered: 필터링된 행의 비율을 나타낸다.
- Extra(왜 이것만 대문자로 시작하지..) : 그 외의 실행 정보를 나타낸다.
인덱스를 타는지 안타는지 확인하는 방법은 possible_keys와 key를 확인하면 된다. 인덱스를 사용할 수 있는 경우라면 possible_keys에 생성된 index의 이름이 나올 것이고 실제 인덱스를 탄다면 key에도 해당 키 값이 나올 것이다.
EXPLAIN ANALYZE
EXPLAIN ANALYZE구문은 실제 쿼리를 실행하여 그 결과를 요약해서 보여주는 구문이다. 위의 EXPLAIN과 다른 점은 실제 쿼리가 실행된다는 것이다.
따라서 단순 EXPLAIN과는 다르게 실행 시간이라던가 실제 쿼리가 실행된 것을 평가할 수 있는 지표를 보여준다.