2009년 12월 14일 월요일

MySQL - 모니터링5

옵티마이져의 동작을 확인(EXPLAIN SELECT)

EXPLAIN문으로 SELECT에 대한 옵티마이져의 정보를 아는 것이 가능하다.

구문은 다음과 같이 된다.

EXPLAIN [EXTENDED|PARTITIONS] SELECT문

EXPLAIN PARTITIONS는 파티셔닝된 테이블에 대한 쿼리를 검사한다.
EXPLAIN EXTENDED는 filtered정보가 추가적으로 얻을 수 있다. 또 계속해서 SHOW WARNINGS을 실행하면 컬럼명등 정보를 얻을 수 있다.

MySQL 5.1.12-beta에서 추가되었다.

mysql> explain select * from m_page where page_id > 5\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: m_page
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 120
Extra: Using where
1 row in set (0.00 sec)


각 컬럼의 의미는 다음과 같다.

  • id: 쿼리내의 SELECT순번
  • select_type: SIMPLE, PRIMARY, UNION, DEPENDENT UNION, UNION RESULT, SUBQUERY, DERIVED, DEPENDENT SUBQUERY, UNCACHEABLE SUBQUERY
  • table:대상이 되는 테이블
  • type: JOIN종류. system, const, eq_ref, ref, ref_or_null, index_merge, unique_subquery, index_subquery, range, index, ALL
  • possible_keys:어느 인덱스가 사용가능한지 나타냄. EXPLAIN에 표시되는 테이블 순서에 따라서 사용가능한 키가 바뀌는 경우가 있다. NULL이면 적절한 인덱스는 찾을 수 없었다는 것을 나타냄. 이 경우 퀄리 조건절의 기술을 수정할 것을 권함.
  • key: 사용하려고 결정된 키가 표시됨. NULL이면 인덱스는 사용되지 않고 있다는 것을 의미. MyISAM의 경우, ANALYZE TABLE문 실시로 개선되는 경우도 있음. 인덱스사용을 강제하는 문에는 다음과 같은 것이 있다. FORCE INdEX, USE INDEX, IGNORE INDEX
  • key_len: 사용하려고 결정된 키의 크기
  • ref: 어느 컬럼이나 정수가 인덱스하고 비교되는지를 나타냄.
  • filtered: MySQL 5.1.12-beta에서 추가되었다. 다음 관계가 있다. rows × filtered ÷100 = 전 테이블과 조인된 레코드수 . filtered는 조건에 따라서 취득되어야 하는 레코드가 레코드 전체의몇 %가 되는 지를 나타냄.
  • Extra:부가 설명이 제공됨. 어떤 처리를 수행하는지 나타냄. Distinct, Not exists, Range checked for each record(index map: N), Using filesort, Using index, Using temporary, Using where, Using sort_union(...), Using union(...), Using intersect(...), Using index for group-by, Using where with pushed condition