Changes between Initial Version and Version 1 of MariaDB ANALYZE


Ignore:
Timestamp:
Nov 11, 2025, 6:18:55 PM (4 weeks ago)
Author:
yongwoo
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • MariaDB ANALYZE

    v1 v1  
     1[[PageOutline]]
     2= ANALYZE =
     3EXPLAIN 명령과 비슷하나, 실제로 SQL문을 실행해서 EXPLAIN의 결과(Query Optimizer)와 비교까지 해준다.
     4
     5mysql 클라이언트로 결과를 볼 때는 \G 를 붙여서 세로로 출력하는 게 보기 편하다.
     6{{{
     7MariaDB> 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{{{
     37ANALYZE 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 처음으로]