실행계획 사용
실행계획의 필요성
* SQL문 수행간 옵티마이져가 판단한 최적의 절차와 방법
* 최소의 일량인 COST를 통계정보를 바탕으로 결정함
* 튜닝의 기본적인 근거로 사용되며 사용자가 힌트를 통해 수정도 할 수 있음
통계정보 수집
* ANALYZE TABLE 테이블명;
실행계획의 확인
explain [ extended | partitions ] [ select | insert | update ]
수행중인 쿼리의 실행계획 확인
show explain for <process_id>
실행계획 구성 요소
기본적으로 실행계획은 위에서 아래로 읽는다. 쿼리의 문장과 비교해가면서 위부터 테이블과 매칭해서 보면 된다.
ID: SELECT 쿼리별로 부여되는 식별자
SELECT_TYPE: 어떤 유형의 쿼리인지 표시
TABLE: 액세스한 테이블로, alias가 쓰인경우 alias로 표시
TYPE: 테이블의 레코드를 어떤 방식으로 읽었는지 표시
KEYS: 최종 선택된 인덱스
ROWS: 옵티마이저가 산출해 낸 예상 건수
EXTRA: 성능에 관련된 정형화된 문장이 표시
SQL profiling
보다 자세히 sql을 분석하기 위해 profiling을 사용할 수 있다. 어느 부분에서 가장 많이 수행됐는지를 통해 튜닝포인트를 어디에 둘것인지 정할수 가 있다.
SELECT @@profiling;
+-------------+
| @@profiling |
+-------------+
| 0 |
+-------------+
SET profiling = 1;
USE test;
DROP TABLE IF EXISTS t1;
CREATE TABLE T1 (id INT);
SHOW PROFILES;
+----------+------------+--------------------------+
| Query_ID | Duration | Query |
+----------+------------+--------------------------+
| 1 | 0.00009200 | SELECT DATABASE() |
| 2 | 0.00023800 | show databases |
| 3 | 0.00018900 | show tables |
| 4 | 0.00014700 | DROP TABLE IF EXISTS t1 |
| 5 | 0.24476900 | CREATE TABLE T1 (id INT) |
+----------+------------+--------------------------+
SHOW PROFILE;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000042 |
| checking permissions | 0.000044 |
| creating table | 0.244645 |
| After create | 0.000013 |
| query end | 0.000003 |
| freeing items | 0.000016 |
| logging slow query | 0.000003 |
| cleaning up | 0.000003 |
+----------------------+----------+
SHOW PROFILE FOR QUERY 4;
+--------------------+----------+
| Status | Duration |
+--------------------+----------+
| starting | 0.000126 |
| query end | 0.000004 |
| freeing items | 0.000012 |
| logging slow query | 0.000003 |
| cleaning up | 0.000002 |
+--------------------+----------+
SHOW PROFILE CPU FOR QUERY 5;
+----------------------+----------+----------+------------+
| Status | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| starting | 0.000042 | 0.000000 | 0.000000 |
| checking permissions | 0.000044 | 0.000000 | 0.000000 |
| creating table | 0.244645 | 0.000000 | 0.000000 |
| After create | 0.000013 | 0.000000 | 0.000000 |
| query end | 0.000003 | 0.000000 | 0.000000 |
| freeing items | 0.000016 | 0.000000 | 0.000000 |
| logging slow query | 0.000003 | 0.000000 | 0.000000 |
| cleaning up | 0.000003 | 0.000000 | 0.000000 |
+----------------------+----------+----------+------------+