'explain'에 해당되는 글 1건

  1. 2015.05.15 [Mysql] 실행계획2 (1)
MySQL2015.05.15 00:31

 

3. 테이블 컬럼

MySQL의 실행 계획은 단위 SELECT 쿼리 기준이 아니라 테이블 기준으로 표시된다.

테이블 컬럼에 "<>"로 둘러싸인 이름이 명시되는 경우 해당 테이블은 임시 테이블을 의미한다.

   

EXPLAIN

SELECT *

FROM

(SELECT de.emp_no FROM dept_emp de) tb,

employees e

WHERE e.emp_no = tb.emp_no;

   

   

4. type 컬럼

각 테이블 접근 방식으로 해석하면 된다.

   

system

레코드가 1건만 존재하는 테이블 또는 한 건도 존재하지 않는 테이블을 참조하는 형태의 접근 방법(MyISAM, MEMORY 테이블에만 해당)

   

const

쿼리가 프라이머리 키나 유니크 키 칼럼을 이용하는 WHERE 조건 절을 가지고 있으며, 반드시 1건을 반환하는 쿼리 방식

   

EXPLAIN

SELECT * FROM employees WHERE emp_no = 10001;

   

   

eq_ref

조인에서 처음 읽은 테이블의 칼럼 값을 그 다음에 읽어야 할 테이블의 프라이머리 키나 유니크 키 칼럼의 검색 조건에 사용할 때를 eq_ref라고 한다.

   

EXPLAIN

SELECT * FROM dept_emp de, employees e

WHERE e.emp_no =de.emp_no AND de.dept_no = 'd005';

   

   

ref

인덱스의 종류와 관계없이 동등 조건으로 검색할 때는 ref 접근 방법이 사용된다.

   

EXPLAIN

SELECT * FROM dept_emp WHERE dept_no='d005';

   

   

ref_or_null

ref 접근 방식과 같은데, NULL 비교가 추가된 형태다.

   

uinique_subquery

WHERE 조건 절에서 사용될 수 있는 IN (서브쿼리) 형태의 쿼리를 위한 접근 방식으로 중복되지 않은 유니크한 값만 반환할 때 이 접근 방법을 사용 한다.

   

EXPLAIN

SELECT * FROM departments WHERE dept_no IN (SELECT dept_no FROM dept_emp WHERE emp_no=10001);

   

   

index_subquery

IN(서브쿼리)에서 서브쿼리가 중복된 값을 반환할 수는 있지만 중복된 값을 인덱스를 이용해 제거할 수 있을 때 index_subquery 접근 방식이 사용된다.

   

EXPLAIN

SELECT * FROM departments WHERE dept_no IN (

SELECT dept_no FROM dept_emp WHERE dept_no BETWEEN 'd001' AND 'd003');

   

-> 버전이 달라서 실행 계획이 표현이 조금 다름.

   

range

인덱스 레인지 스캔 형태의 접근 방법

   

EXPLAIN

SELECT dept_no FROM dept_emp WHERE dept_no BETWEEN 'd001' AND 'd003';

   

   

index_merge

2개의 이상의 인덱스를 이용해 각각의 검색 결과를 만들어 낸 후 그 결과를 병합하는 처리 방식

   

EXPLAIN

SELECT * FROM employees

WHERE emp_no BETWEEN 10001 AND 11000

OR first_name='Smith';

   

   

index

접근 방식은 인덱스를 처음부터 끝까지 읽는 인덱스 풀 스캔을 의미한다.

   

EXPLAIN

SELECT * FROM departments ORDER BY dept_name DESC LIMIT 10;

   

   

ALL

풀 테이블 스캔을 의미하는 접근 방식

   

5. key_len

인덱스의 각 레코드에서 몇 바이트까지 사용했는지 알려주는 값

   

EXPLAIN

SELECT * FROM dept_emp WHERE dept_no='d005';

   

   

   

   

char

3바이트

integer

4바이트

date

3바이트

   

6. ref

참조 조건으로 어떤 값이 제공됐는지 보여 준다.

const: 상수값

테이블명.칼럼명: 칼럼값

EXPLAIN

SELECT *

FROM employees e, dept_emp de

WHERE e.emp_no = de.emp_no;

   

   

func: 콜레이션 변환, 연산을 거친 값

EXPLAIN

SELECT *

FROM employees e, dept_emp de

WHERE e.emp_no =(de.emp_no-1);

   

   

7. rows

실행 계획의 효율성 판단을 위해 예측했던 레코드 건수를 보여 준다. 예상 값이라 정확하지 않다

   

EXPLAIN

SELECT * FROM dept_emp WHERE from_date >= '1985-01-01';

   

   

EXPLAIN

SELECT * FROM dept_emp WHERE from_date >= '2002-07-01';

   

   

EXPLAIN

SELECT * FROM dept_emp WHERE from_date >= '1985-01-01' LIMIT 10;

   

;

   

>

신고

'MySQL' 카테고리의 다른 글

[Mysql] 변수  (0) 2016.05.19
[Mysql] 제어문  (0) 2016.05.19
[Mysql] 스토어드 함수  (0) 2016.05.17
[Mysql] 스토어드 프로시저  (0) 2016.05.17
[Mysql] 실행계획2  (1) 2015.05.15
[Mysql] 실행계획  (0) 2015.05.11
Posted by TM ~ing