실행 계획이란
쿼리 평가 엔진에서 SQL 구문을 분석하고 어떤 순서로 기억장치의 데이터에 접근 할지를
결정 하는데 이 때 결정되는 계획을 실행 계획 또는 실행 플랜이라고 한다.
쿼리 평가 엔진
파서
SQL 구문을 분석 하여 잘못된 문법으로 이루어져 있는지 등을 체크 한다.
옵티마이저
인덱스 유무, 데이터 분산 등 여러 조건을 고려해서 선택 가능한 많은 실행 계획을
작성 해서 이들의 비용을 연산 하여 가장 낮은 비용을 가진 실행 계획을 선택 하는 일을 한다.
카탈로그 매니저
DB의 내부 정보 (테이블 정보, 인덱스 정보등등)을 모아놓은 테이블로 옵티마이저가
실행 계획을 세울 때 정보를 제공하는 역할을 한다.
플랜 평가
옵티마이저가 세운 실행 계획을 받아 최적의 실행 결과를 선택하는 역할을 한다.
SQL 실행 계획 확인 방법
RDB마다 확인 하는 방법이 다르기 때문에 현재 주로 쓰는 MySQL 기준으로 작성
1 | EXPLAIN sql구문 |
select_type
쿼리의 복잡도, 문서에는 유니온이나 서브쿼리등을 사용 하면 바뀐다고 하는데 써보지는 않았다.
table
어떤 테이블에 접근해서 결과를 가져오는지 알려준다.
type
몇 가지만 정리
- all: 테이블의 모든 행을 검색을 한 경우
- index: 해당 인덱스를 모두 검색한 경우
- range: 인덱스 특정 범위의 행만 검색
- ref: 고유 키가 아닌 인덱스에 등가 비교(=, >, < 같은)한 경우
- const: 고유 키로 검색을 해서 1개의 결과가 나올 경우
possible_key
해당 데이터를 찾기 위해 MySQL에서 사용하려는 키
null은 관련된 인덱스가 없다는 뜻
key
실제 사용한 키
rows
결과 값을 찾기 위해 어느 만큼의 row를 읽는지 예측 값
연습
실제 위의 테이블은 PK(=id)만 존재한 테이블이고 조건절을 사용 했을 때
모든 row를 검색을 하게 되었는데 조건에 해당하는 event의 index를 생성을 하고
실행 계획을 확인 했더니 rows 수가 줄어들었고 타입도 all -> ref로 바뀌었다.
앞으로 쿼리를 짤 때 실행 계획을 참조 해서 좋은 쿼리를 짜도록 노력 해야 겠다 😊