[MySQL] 실행계획 (Execution Plan) - (3) possible_keys, key, ref, rows

이전 포스팅

 

https://hwannny.tistory.com/100

 

[MySQL] 실행계획 (Execution Plan) - (2) type

이전 포스팅 https://hwannny.tistory.com/99 [MySQL] 실행계획 (Execution Plan) - (1) id, select_type, table 들어가며 테스트는 MySQL 5.6.50 버전에서 진행됐다. 실행계획이란? 쿼리가 실행될 때 DBMS의 옵티..

hwannny.tistory.com

 

 

 

possible_keys, key

 

possible_keys는 옵티마이저가 실행 계획을 세울 때 고려했던 인덱스 목록이다.

key는 옵티마이저가 최종적으로 실행에 사용할 possible_keys에서 선정한 인덱스 이름이다.

 

CREATE TABLE `table1` (
  `table1_id` int(11) NOT NULL,
  PRIMARY KEY (`table1_id`),
  KEY `idx` (`table1_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EXPLAIN SELECT * FROM table1 WHERE table1_id = 1;

 

table1_id 컬럼 조건으로 쿼리를 수행할 때 table1_id 컬럼으로 구성된 인덱스가 PRIMARY, idx 두개가 존재하므로 옵티마이저는 두개의 인덱스중 PRIMARY 인덱스를 선정한것을 확인할 수 있다.

 

일반적으로 하나의 쿼리에 한개의 인덱스만 사용 가능하므로 key 컬럼에 하나의 인덱스 이름만 출력된다. 예외의 경우로 index_merge 접근방식을 사용하면 복수개의 인덱스를 쿼리에 사용하므로 key 컬럼에 쉼표로 구분되어 복수개의 인덱스 이름이 출력될 수 있다.

 

 

 

 

ref

 

동등 조건으로 어떤 값이 참조되어 쿼리가 수행됐는지 표시해준다.

 

1) 상수값을 조건으로 줬다면 ref 컬럼의 값은 const로 표시된다.

 

CREATE TABLE `table1` (
  `table1_id` int(11) NOT NULL
  PRIMARY KEY (`table1_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EXPLAIN SELECT * FROM table1 WHERE table1_id = 1;

 

 

 

 

2) 다른 테이블의 컬럼 값을 조건으로 줬다면 해당 테이블의 컬럼명이 표시된다.

 

EXPLAIN SELECT * FROM table1 c1 INNER JOIN table2 c2 ON c1.table1_id = c2.table2_id;

 

두 번째 row의 ref 컬럼이 c2.table2_id 로 표시된것을 확인할 수 있다.

 

 

 

 

3) 다른 테이블의 컬럼 값이 연산되거나 타입이 변환되어 조건으로 줬다면 func로 표시된다.

 

EXPLAIN SELECT * FROM table1 c1 INNER JOIN table2 c2 ON c1.table1_id = CASE(c2.table2_id AS CHAR(10));
EXPLAIN SELECT * FROM table1 c1 INNER JOIN table2 c2 ON c1.table1_id = (c2.table2_id + 1);

 

쿼리에 직접 연산 또는 타입 변환을 명시하는것 뿐만아니라 MySQL 서버 내부적으로 자동 연산 또는 타입 변환이 수행될 때도 func으로 표시된다.


 

 

rows

 

실행 계획의 효율성을 판단하기 위해 예측했던 레코드 건수를 보여준다. 스토리지 엔진별로 가지고 있는 통계정보를 참조한 예상 값이기 때문에 정확하지는 않다고 한다.

 

 

 

 

참고 서적

 

Real MySQL (이성욱)