Mysql

최적화를 위한 분석(PROCEDURE ANALYSE, EXPLAIN SELECT)

서른마른다섯 2013. 12. 24. 15:00


1. 테이블 칼럼 분석

mysql> select * from 테이블명 PROCEDURE ANALYSE();

출력된 결과에서 Optimal_fieldtype 타입을 확인하여 최적화시킨다

 

 

2. 쿼리 사용 분석

mysql> EXPLAIN SELECT * from user;

        EXPLAIN SELECT select_options

 

각 칼럼의 의미

table

  - 사용한 테이블. 조인일 경우는 행이 여러 개로 나온다.

type

  - 가장 중요한 것 중에 하나이며, 조인이 사용되었는지 말해준다.

  - 가장 좋은 타입부터 가장 나쁜 타입은 system, const, eq-ref, ref, range, index, all 이다.

  - Type에 all이나 index, range 등이 보일 경우는 쿼리가 그다지 빠르지 않다는 것을 의미한다.

      system : 테이블이 하나의 레코드만 가지는 경우

      const  : 테이블에 조건을 만족하는 레코드가 하나일 때, 상수 취급

      eq_ref : 인덱스가 UNIQUE이거나 PRIMARY KEY인 경우의 조인으로 const를 제외한 조인 중 가장 좋은 형태

      ref      : eq_ref와 다른 점은 UNIQUE나 PRIMARY KEY가 아닐 경우 사용한다는 것.

      range : 조건에 레코드의 범위가 주어진 조인.

      index  : all 형태와 비슷하며, 인덱스를 사용한다.

      all      : 모든 레코드를 스캔한다.

possible_keys

  - 사용 가능한 키(인덱스)

key

  - 사용하고 있는 키(인덱스)

key_len

  - 키가 사용된 길이. 작을수록 좋다(int는 4바이트, char(10)은 10바이트를 차지한다.

  - 테이블에서 데이터형의 결정은 되도록이면 int나 smallint, medianint를 사용하는 것이 좋다).

ref

  - 칼럼이나 상수(const)가 사용되었는지 말해준다.

rows

  - 인덱스 범위를 나타낸다. 작을수록 역시 빠르다.

Extra

  - using temporary나 using filesort는 가장 좋지 않다. 

      distinct                                   : 조건을 만족하는 레코드를 찾았을 때 같은 조건을 만족하는 또 다른 레코드가 있는지 검사하지 않음.

      not exist                                 : left join 조건을 만족하는 하나의 레코드를 찾았을 때 다른 레코드의 조합은 더 이상 검사하지 않는다.

      range checked for each record : 최적의 인덱스가 없는 차선의 인덱스를 사용한다는 의미.

      using filesort                          : mysql이 정렬을 빠르게 하기 위해 부가적인 일을 한다.

      unsing index                          : select 할때 인덱스 파일만 사용

      using temporary                      : 임시 테이블을 사용한다. order by 나 group by 할때 주로 사용

      where used                           : 조건을 사용한다는 의미.


출처 : http://blog.naver.com/gilzza/130077401059