14.13.17 InnoDB 테이블에 ANALYZE TABLE의 복잡성 추정
InnoDB
테이블에 ANALYZE TABLE
의 복잡성은 다음에 따라 달라집니다.
innodb_stats_persistent_sample_pages
에 정의 된 추출 된 페이지 수입니다.테이블의 인덱스 컬럼의 수
파티션 번호 테이블에 파티션이 존재하지 않는 경우, 파티션의 수는 1로 간주됩니다.
이러한 매개 변수를 사용하면 ANALYZE TABLE
의 복잡성을 추정하기위한 개략의 계산식은 다음과 같이됩니다.
innodb_stats_persistent_sample_pages
값 * 테이블의 인덱스 컬럼의 수 * 파티션 수
일반적으로 결과 값이 클수록 ANALYZE TABLE
의 실행 시간도 커집니다.
innodb_stats_persistent_sample_pages
은 글로벌 수준에서 샘플링 된 페이지의 수를 정의합니다. 개별 테이블의 샘플링되는 페이지의 수를 설정하려면 CREATE TABLE
또는 ALTER TABLE
에서 STATS_SAMPLE_PAGES
옵션을 사용합니다. 자세한 내용은 섹션 14.13.16.1 "영구 옵티 마이저 통계 매개 변수 구성" 을 참조하십시오.
innodb_stats_persistent=OFF
인 경우 추출 된 페이지의 수는 innodb_stats_transient_sample_pages
에서 정의됩니다. 자세한 내용은 섹션 14.13.16.2 "비 영구 옵티 마이저 통계 매개 변수 구성" 을 참조하십시오.
ANALYZE TABLE
의 복잡성을 추정하기위한 자세한 방법을 설명하기 위해 다음의 예를 생각해 보겠습니다.
빅오 표기법 에서는 ANALYZE TABLE
의 복잡성은 다음과 같이 설명됩니다.
O (n_sample * (n_cols_in_uniq_i + n_cols_in_non_uniq_i + n_cols_in_pk * (1 + n_non_uniq_i)) * n_part)
여기에서 :
n_sample
는 추출 된 페이지의 수 (innodb_stats_persistent_sample_pages
에서 정의됩니다)n_cols_in_uniq_i
는 모든 고유 인덱스의 모든 컬럼의 총 (프라이 머리 키 컬럼은 계산하지 않는다)n_cols_in_non_uniq_i
는 모든 고유하지 않은 인덱스의 모든 컬럼의 총n_cols_in_pk
기본 키의 컬럼 수 (기본 키가 정의되어 있지 않은 경우,InnoDB
는 단일 컬럼의 기본 키를 내부적으로 만듭니다)n_non_uniq_i
는 테이블의 고유하지 않은 인덱스의 수n_part
는 파티션 번호 파티션이 정의되어 있지 않은 경우, 그 테이블은 단일 파티션으로 간주됩니다.
여기에서 기본 키 (2 개의 컬럼) 고유 인덱스 (두 개의 열) 및 2 개의 고유하지 않은 인덱스 (각각 2 개의 컬럼)을 가진 다음 테이블 (테이블 t
)를 생각해 보겠습니다.
CREATE TABLE t ( a INT, b INT, c INT, d INT, e INT, f INT, g INT, h INT, PRIMARY KEY (a, b) UNIQUE KEY i1uniq (c, d) KEY i2nonuniq (e, f) KEY i3nonuniq (g, h) );
위에서 설명한 알고리즘에 필요한 컬럼과 인덱스 데이터의 테이블 t
의 mysql.innodb_index_stats
영구 인덱스 통계 테이블에 쿼리합니다. n_diff_pfx%
의 통계에는 각 인덱스에 대해 계산되는 열이 표시됩니다. 예를 들어, 컬럼 a
와 b
는 기본 키 인덱스에 대해 계산됩니다. 고유하지 않은 인덱스의 경우, 사용자 정의 컬럼 이외에, 프라이 머리 키 컬럼 (a, b)가 계산됩니다.
InnoDB
영구 통계 테이블의 자세한 내용은 섹션 14.13.16.1 "영구 옵티 마이저 통계 매개 변수 구성" 을 참조하십시오.
SELECT index_name, stat_name, stat_description FROM mysql.innodb_index_stats WHERE database_name='test' AND table_name='t' AND stat_name like 'n_diff_pfx%'; +------------+--------------+------------------+ | index_name | stat_name | stat_description | +------------+--------------+------------------+ | PRIMARY | n_diff_pfx01 | a | | PRIMARY | n_diff_pfx02 | a,b | | i1uniq | n_diff_pfx01 | c | | i1uniq | n_diff_pfx02 | c,d | | i2nonuniq | n_diff_pfx01 | e | | i2nonuniq | n_diff_pfx02 | e,f | | i2nonuniq | n_diff_pfx03 | e,f,a | | i2nonuniq | n_diff_pfx04 | e,f,a,b | | i3nonuniq | n_diff_pfx01 | g | | i3nonuniq | n_diff_pfx02 | g,h | | i3nonuniq | n_diff_pfx03 | g,h,a | | i3nonuniq | n_diff_pfx04 | g,h,a,b | +------------+--------------+------------------+
위에 나열된 인덱스 통계 데이터와 테이블 정의에 따라 다음 값을 확인할 수 있습니다.
n_cols_in_uniq_i
(모든 고유 인덱스의 모든 컬럼의 총수, 프라이 머리 키 컬럼은 계산하지 않는다) 2 (c
및d
)n_cols_in_non_uniq_i
(모든 고유하지 않은 인덱스의 모든 컬럼의 총) 4 (e
,f
,g
및h
)n_cols_in_pk
(기본 키의 컬럼 수) 2 (a
및b
)n_non_uniq_i
(테이블의 고유하지 않은 인덱스의 수) 2 (i2nonuniq
및i3nonuniq
)n_part
(파티션 수) 1.
이제 스캔되는 리프 페이지의 수를 결정하기 위해 innodb_stats_persistent_sample_pages
* (2 + 4 + 2 * (1 + 2)) * 1을 계산할 수 있습니다. innodb_stats_persistent_sample_pages
가 20
기본값으로 설정되어 있고 또한 페이지 크기가 기본 16 KiB
( innodb_page_size
= 16384) 인 경우는 테이블 t
에 대해 20 * 12 * 16384 byte
, 즉 약 4 MiB
이 읽을 때 추정 할 수 있습니다.
일부 리프 페이지는 이미 버퍼 풀에 캐시되어있을 수 있기 때문에 4 MiB
의 모든 디스크에서 읽는 것은 없습니다.