RealMySQL 을 읽고 정리한 내용입니다.
MySQL 에서는 EXPLAIN 이라는 명령으로 쿼리의 실행 계획을 확인할 수 있다. 실행 계획로 나오는 내용이 무엇을 의미하는지 정리하자
explain 쿼리 실행계획 파악을 어떻게 하는지 실행 계획의 결과가 의미하는 것들이 무엇인지 알아보자
id 컬럼
하나의 쿼리는 여러 select 절로 이루어 질 수 있다. id 컬럼의 값은 select 쿼리 별로 부여 되는 식별자 값이다.
하나의 select 문에서 여러 테이블을 조인 했을때는 조인되는 테이블의 개수 만큼 레코드가 출력되지만, id 컬럼의 값은 하나이다.
select_type 컬럼
select 쿼리가 어떤 타입의 쿼리인지 나타냄 다음의 값들이 올 수 있음
- SIMPLE
- PRIMARY
- UNION
- DEPENDENT UNION
- SUBQUERY
- DEPENDENT SUBQUERY
- DERIVED
- UNCACHABLE SUBQUERY
- UNCACHABLE UNION
많네..
SIMPLE
- 유니온이나 서브쿼리가 없는 단순한 쿼리인 경우 가장 바깥 쿼리
- select_type 이 SIMPLE 인 단위 쿼리는 하나만 존재함
PRIMARY
- 유니온이나 서브쿼리가 포함되어 있는 쿼리인 경우 가장 바깥 쿼리
- select_type 이 PRIMARY 인 단위 쿼리는 하나만 존재함
UNION
- UNION 으로 결합하는 쿼리 중 첫번째 쿼리를 제외한 쿼리
DEPENDENT UNION
- UNION 으로 결합하지만, UNION 을 하는 단위쿼리가 외부에 영향을 받을때
- 내부 쿼리가 외부 쿼리에 영향을 받을때 DEPENDENT 키워드가 붙는다.
SUBQUERY
- FROM 절 이외에서 사용되는 서브쿼리
DEPENDENT SUBQUERY
- 서브 쿼리가 바깥쪽 SELECT 쿼리에서 정의된 칼럼을 사용하는 경우
- 외부 쿼리가 먼저 수행된 후 내부 쿼리 (서브 쿼리) 가 실행돼야 하므로 DEPENDENT 키워드가 없는 서브쿼리보다 처리 속도가 느릴 때가 많음
서브쿼리에 outer 쿼리의 emp_no 가 사용되어서 외부 쿼리에 영향을 받아 DEPENDENT 키워드가 붙었음
DERIVED
- 서브 쿼리가 FROM 절에 사용된 경우
- MySQL 은 FROM 절의 서브쿼리를 임시 테이블로 만들어서 처리한다.
- DERIVED 형태의 서브쿼리를 조인으로 해결할 수 있다면 조인으로 처리해주는게 성능이 더 좋다. (조인이 최적화가 많이 되기 때문)
UNCACHEABLE SUBQUERY
조건이 똑같은 서브 쿼리가 실행될 때는 다시 실행하지 않고 이전의 실행 결과를 그대로 사용할 수 있게 서브 쿼리의 결과를 내부적인 캐시 공간에 담아둔다. (서브 쿼리 캐시는 쿼리 캐시나 파생 테이블과는 무관하다)
서브쿼리는 다음과 같이 캐시한다.
- SUBQUERY 를 바깥쪽의 영향을 받지 않으므로 처음 한 번만 실행해서 그 결과를 캐시한다.
- DEPENDENT SUBQUERY 는 의존하는 바깥쪽 쿼리의 칼럼의 값 단위로 캐시해두고 사용한다.
그런데 서브 쿼리에 포함된 요소에 의해 캐시 자체가 불가능할 수가 있다. 캐시를 사용하지 못하도록 하는 요소로는 다음과 같은 것 들이 있다.
- 사용자 변수가 서브쿼리에 사용된 경우
- NON-DETERMINISTIC 속성의 스토어드 루틴이 서브 쿼리 내에 사용된 경우
- UUID() 나 RAND() 와 같이 결과값이 호출할 때마다 달라지는 함수가 서브 쿼리에 사용된 경우
UNCACHEABLE UNION
- UNION 인 단위 쿼리에 캐시될 수 없는 요소가 있는 경우