wiki:MariaDB ANALYZE

Version 1 (modified by yongwoo, 4 weeks ago) ( diff )

ANALYZE

EXPLAIN 명령과 비슷하나, 실제로 SQL문을 실행해서 EXPLAIN의 결과(Query Optimizer)와 비교까지 해준다.

mysql 클라이언트로 결과를 볼 때는 \G 를 붙여서 세로로 출력하는 게 보기 편하다.

MariaDB> ANALYZE select * from t1\G

결과값의 주요 항목은 다음과 같다.

항목설명
rows테이블에서 읽을 것으로 예상한 데이터 숫자. where 조건을 충족하는지 아닌지 알아보기 위해 읽은 데이터도 포함한다.
r_rows테이블에서 실제로 읽은 데이터 숫자. Null인 경우엔 아예 테이블에서 데이터를 읽지 않았음을 의미한다. where 조건을 충족하는지 아닌지 알아보기 위해 읽은 데이터도 포함한다.
filtered읽을 데이터 중 where 조건을 만족하는 데이터의 비율 예측. 100%라면 읽은 데이터를 모두 레코드셋으로 반환할 것이라는 뜻.
r_filtered읽은 데이터 중 where 조건을 만족하는 데이터의 실제 비율. Null인 경우엔 아예 테이블에서 데이터를 읽지 않았음을 의미한다. 일반적으로 fullscan이 있고 이 값이 15 % 미만이라면 인덱스 추가를 고려해야 한다.
type테이블에서 데이터를 찾는 방법
possible_keys테이블에서 사용할 수 있는 인덱스
key데이터를 불러올 때 사용한 인덱스. Null이라면 어떤 인덱스도 사용하지 않음을 의미.
key_len사용한 인덱스의 바이트 수. 복합 키에서 일부만 사용했는지를 보여준다.
ref참조키
Extra추가 정보

Type 컬럼에 대한 설명

항목설명
All인덱스를 사용하지 않음. full table scan. BAD!
const테이블에 일치할 수 있는 데이터가 하나 뿐.
range인덱스의 범위값으로 데이터를 불러옴
index인덱스에 대한 full scan. 인덱스가 크고 join되어 있다면 All 보다는 낫지만 여전히 문제가 있다.

Extra 컬럼에 대한 설명

항목설명
Using where인덱스 검색 외에 추가적으로 where 조건을 검색함.

ANALYZE FORMAT=JSON

다음과 같이 FORMAT=JSON 옵션으로 ANALYZE 명령을 실행하면 좀더 자세한 정보를 얻을 수 있다.

ANALYZE FORMAT=JSON select * from t1;
  • r_loops: 각 노드가 몇 번 실행되었는지.
  • r_total_time_ms: 각 노드를 실행하는 데 걸린 시간. (하위 노드 실행 시간까지 포함)
  • r_buffer_size: 사용한 버퍼의 크기

+------+-------------+-------------------+-------+-------------------------------------------------+-------------------------+---------+------+---------+-----------+----------+------------+-------------+
| id   | select_type | table             | type  | possible_keys                                   | key                     | key_len | ref  | rows    | r_rows    | filtered | r_filtered | Extra       |
+------+-------------+-------------------+-------+-------------------------------------------------+-------------------------+---------+------+---------+-----------+----------+------------+-------------+
|    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 |
+------+-------------+-------------------+-------+-------------------------------------------------+-------------------------+---------+------+---------+-----------+----------+------------+-------------+
  • x_ie1_switch_trans_json 인덱스를 사용했다.
  • Query Optimizer는 1,769,914 행을 읽을 것으로 예측했으나 실제로는 924,143행을 읽었고(예측한 것의 약 52%),
  • Query Optimizer는 1,769,914 행 중 where 조건을 만족하는 행을 예측하지 못해서 100%로 간주했으나 실제로는 8.26%의 행이 where 조건을 만족했다.

처음으로

Note: See TracWiki for help on using the wiki.