최적화를 위한 분석(PROCEDURE ANALYSE, EXPLAIN SELECT)
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 : 조건을 사용한다는 의미.