| | 1 | [[PageOutline]] |
| | 2 | = ANALYZE = |
| | 3 | EXPLAIN 명령과 비슷하나, 실제로 SQL문을 실행해서 EXPLAIN의 결과(Query Optimizer)와 비교까지 해준다. |
| | 4 | |
| | 5 | mysql 클라이언트로 결과를 볼 때는 \G 를 붙여서 세로로 출력하는 게 보기 편하다. |
| | 6 | {{{ |
| | 7 | MariaDB> ANALYZE select * from t1\G |
| | 8 | }}} |
| | 9 | |
| | 10 | 결과값의 주요 항목은 다음과 같다. |
| | 11 | ||항목||설명|| |
| | 12 | ||rows||테이블에서 읽을 것으로 예상한 데이터 숫자. where 조건을 충족하는지 아닌지 알아보기 위해 읽은 데이터도 포함한다.|| |
| | 13 | ||r_rows||테이블에서 실제로 읽은 데이터 숫자. Null인 경우엔 아예 테이블에서 데이터를 읽지 않았음을 의미한다. where 조건을 충족하는지 아닌지 알아보기 위해 읽은 데이터도 포함한다. || |
| | 14 | ||filtered||읽을 데이터 중 where 조건을 만족하는 데이터의 비율 예측. 100%라면 읽은 데이터를 모두 레코드셋으로 반환할 것이라는 뜻.|| |
| | 15 | ||r_filtered||읽은 데이터 중 where 조건을 만족하는 데이터의 실제 비율. Null인 경우엔 아예 테이블에서 데이터를 읽지 않았음을 의미한다. 일반적으로 fullscan이 있고 이 값이 15 % 미만이라면 인덱스 추가를 고려해야 한다.|| |
| | 16 | ||type||테이블에서 데이터를 찾는 방법|| |
| | 17 | ||possible_keys||테이블에서 사용할 수 있는 인덱스|| |
| | 18 | ||key||데이터를 불러올 때 사용한 인덱스. Null이라면 어떤 인덱스도 사용하지 않음을 의미.|| |
| | 19 | ||key_len||사용한 인덱스의 바이트 수. 복합 키에서 일부만 사용했는지를 보여준다.|| |
| | 20 | ||ref||참조키|| |
| | 21 | ||Extra||추가 정보|| |
| | 22 | |
| | 23 | == Type 컬럼에 대한 설명 == |
| | 24 | ||항목||설명|| |
| | 25 | ||All||인덱스를 사용하지 않음. full table scan. BAD! || |
| | 26 | ||const||테이블에 일치할 수 있는 데이터가 하나 뿐. || |
| | 27 | ||range||인덱스의 범위값으로 데이터를 불러옴|| |
| | 28 | ||index||인덱스에 대한 full scan. 인덱스가 크고 join되어 있다면 All 보다는 낫지만 여전히 문제가 있다.|| |
| | 29 | |
| | 30 | == Extra 컬럼에 대한 설명 == |
| | 31 | ||항목||설명|| |
| | 32 | ||Using where||인덱스 검색 외에 추가적으로 where 조건을 검색함.|| |
| | 33 | |
| | 34 | == ANALYZE FORMAT=JSON |
| | 35 | 다음과 같이 FORMAT=JSON 옵션으로 ANALYZE 명령을 실행하면 좀더 자세한 정보를 얻을 수 있다. |
| | 36 | {{{ |
| | 37 | ANALYZE FORMAT=JSON select * from t1; |
| | 38 | }}} |
| | 39 | - r_loops: 각 노드가 몇 번 실행되었는지. |
| | 40 | - r_total_time_ms: 각 노드를 실행하는 데 걸린 시간. (하위 노드 실행 시간까지 포함) |
| | 41 | - r_buffer_size: 사용한 버퍼의 크기 |
| | 42 | |
| | 43 | == 예 == |
| | 44 | {{{ |
| | 45 | +------+-------------+-------------------+-------+-------------------------------------------------+-------------------------+---------+------+---------+-----------+----------+------------+-------------+ |
| | 46 | | id | select_type | table | type | possible_keys | key | key_len | ref | rows | r_rows | filtered | r_filtered | Extra | |
| | 47 | +------+-------------+-------------------+-------+-------------------------------------------------+-------------------------+---------+------+---------+-----------+----------+------------+-------------+ |
| | 48 | | 1 | SIMPLE | switch_trans_json | range | x_ie2_switch_trans_json,x_ie1_switch_trans_json | x_ie1_switch_trans_json | 91 | NULL | 1769914 | 924143.00 | 100.00 | 8.26 | Using where | |
| | 49 | +------+-------------+-------------------+-------+-------------------------------------------------+-------------------------+---------+------+---------+-----------+----------+------------+-------------+ |
| | 50 | }}} |
| | 51 | - x_ie1_switch_trans_json 인덱스를 사용했다. |
| | 52 | - Query Optimizer는 1,769,914 행을 읽을 것으로 예측했으나 실제로는 924,143행을 읽었고(예측한 것의 약 52%), |
| | 53 | - Query Optimizer는 1,769,914 행 중 where 조건을 만족하는 행을 예측하지 못해서 100%로 간주했으나 실제로는 8.26%의 행이 where 조건을 만족했다. |
| | 54 | |
| | 55 | |
| | 56 | ---- |
| | 57 | [WikiStart 처음으로] |