관련 지식 포인트:
INNODB_STATS_PERSIST=ON
또는 STATS_PERSIST=1
단일 테이블을 정의할 때 최적화 프로그램 통계가 디스크에 유지됩니다. 기본적으로 innodb_stats_persistent
활성화되어 있습니다.
mysql.innodb_table_stats
영구 통계는 및 mysql.innodb_index_stats
테이블 에 저장됩니다 .
기본적으로 활성화된 변수는 innodb_stats_auto_recalc
테이블 행의 10% 이상이 변경될 때 통계가 자동으로 계산되는지 여부를 제어합니다. 테이블을 생성하거나 변경할 때 절을 지정하여 개별 테이블에 대해 STATS_AUTO_RECALC
자동 통계 재계산을 구성할 수 있습니다.
백그라운드에서 발생하는 자동 통계 재계산의 비동기적 특성으로 인해 활성화된 경우에도 innodb_stats_auto_recalc
테이블의 10% 이상에 영향을 미치는 DML 작업을 실행한 후에 통계가 즉시 재계산되지 않습니다. 경우에 따라 통계 재계산이 몇 초 정도 지연될 수 있습니다. 최신 통계가 즉시 필요한 경우 ANALYZE TABLE을 실행하여 통계의 동기(포그라운드) 재계산을 시작합니다.
비활성화된 경우 innodb_stats_auto_recalc
인덱스 열을 많이 변경한 후 ANALYZE TABLE 문을 실행하여 최적화 프로그램 통계의 정확성을 보장할 수 있습니다.
INNODB_STATS_PERSIST=OFF
를 사용하여 단일 테이블을 생성하거나 변경할 때 STATS_PERSIST=0
최적화 도구 통계가 디스크에 유지되지 않습니다 . 대신 통계는 메모리에 저장되며 서버가 종료되면 손실됩니다. 통계는 특정 작업을 통해 특정 조건에서 주기적으로 업데이트됩니다.
기존 테이블에 인덱스를 추가하거나 컬럼을 추가 또는 제거하는 경우에는 값에 관계없이 innodb_stats_auto_recalc
인덱스 통계가 계산되어 테이블에 추가됩니다 .innodb_index_stats
통계에 영향을 미치는 5가지 매개변수
-
innodb_stats_persistent
: InnoDB 인덱스 통계가 디스크에 유지되는지 여부를 지정합니다. 기본적으로 활성화되어 있습니다. -
innodb_stats_persistent_sample_pages
: 인덱스 열에 대한 카디널리티 및 기타 통계(예: 분석 테이블에서 계산된 통계)를 추정할 때 샘플링할 인덱스 페이지 수입니다. 이 값을 늘리면 인덱스 통계의 정확성이 향상되지만,innodb_stats_persistent_sample_pages
값을 높이면 분석 테이블을 실행하는 데 시간이 더 오래 걸릴 수 있습니다. -
innodb_stats_auto_recalc
: 테이블의 데이터가 크게 변경된 후 InnoDB가 자동으로 영구 통계를 다시 계산하도록 합니다. 임계값은 테이블 행 수의 10%이며 기본적으로 켜져 있습니다. -
innodb_stats_include_delete_marked
: InnoDB에 영구 최적화 프로그램 통계를 계산할 때 삭제 표시된 레코드가 포함되어 있는지 여부는 기본적으로 꺼져 있습니다. -
innodb_stats_transient_sample_pages
: 인덱스 열에 대한 카디널리티 및 기타 통계(예: 분석 테이블에서 계산된 통계)를 추정할 때 샘플링할 인덱스 페이지 수입니다. 기본값은 8입니다. 이 값을 늘리면 인덱스 통계의 정확성이 향상되어 쿼리 실행 계획이 향상되지만 InnoDB 테이블을 열거나 통계를 다시 계산할 때 I/O가 증가합니다. 이 매개변수는 테이블에 대해 비활성화된 경우에만 적용되며innodb_stats_persistent
, 활성화된 경우 대신INNODB_STATS_PERSIST
적용됩니다 .INNODB_STATS_PERSIST_SAMPLE_PAGES
innodb_stats_sample_pages
요약하다:
1. 비영구적인 통계 정보는 다음과 같은 상황에서 자동으로 업데이트됩니다.
- ANALYZE TABLE 실행
innodb_stats_on_metadata=ON
이 경우 SHOW TABLE STATUS, SHOW INDEX를 실행하고 INFORMATION_SCHEMA에서 TABLES 및 STATISTICS를 쿼리합니다.- --auto-rehash 기능이 활성화된 상태에서 mysql 클라이언트를 사용하여 로그인합니다.
- 테이블이 처음으로 열렸습니다.
- 마지막 통계정보 업데이트 이후 표 1/16의 데이터가 수정되었습니다.
비지속적 통계의 단점은 명백합니다. 데이터베이스가 재시작된 후 많은 수의 테이블이 통계를 업데이트하기 시작하면 인스턴스에 큰 영향을 미치게 되므로 현재는 지속적 통계를 사용하고 있습니다.
2. 지속성 통계는 다음 상황에서 자동으로 업데이트됩니다.
-
INNODB_STATS_AUTO_RECALC=ON
이 경우 테이블의 데이터 중 10%가 수정됩니다. -
새 색인 추가
3. 부정확한 통계정보의 처리
실행 계획을 확인한 결과 올바른 인덱스가 사용되지 않은 것으로 나타났습니다. innodb_index_stats의 통계 정보에 큰 차이가 발생하는 경우 다음과 같은 방법으로 처리할 수 있습니다.
- 통계 정보를 수동으로 업데이트하세요. 실행 중에 읽기 잠금이 추가된다는 점에 유의하세요.
ANALYZETABLE TABLE_NAME;
- 업데이트 후에도 통계 정보가 부정확한 경우 테이블 샘플링을 위한 데이터 페이지를 추가하는 것을 고려할 수 있습니다. 이를 수정하는 방법에는 두 가지가 있습니다.
a. INNODB_STATS_PERSISTENT_SAMPLE_PAGES
전역 변수의 기본값은 20입니다.
b. 단일 테이블은 테이블의 샘플링을 지정할 수 있습니다.
ALTER TABLE TABLE_NAME STATS_SAMPLE_PAGES=40;
테스트 후 STATS_SAMPLE_PAGES
최대값은 65535입니다. 이를 초과하면 오류가 보고됩니다.
c. 테이블 통계를 수동으로 업데이트한 innodb_table_stats
다음 innodb_index_stats
(이 두 테이블을 수정하면 binlog가 생성되지 않음) FLUSH TABLE tbl_name
명령문을 사용하여 업데이트된 통계를 로드합니다.
GreatSQL을 즐겨보세요 :)
GreatSQL 소개
GreatSQL은 금융 수준의 애플리케이션에 적합한 국내 독립 오픈소스 데이터베이스로, 고성능, 높은 신뢰성, 높은 사용 편의성, 높은 보안성 등 많은 핵심 기능을 갖추고 있으며 MySQL 또는 Percona Server를 대체하여 사용할 수 있습니다. 온라인 생산 환경에서 사용되며 완전 무료이며 MySQL 또는 Percona Server와 호환됩니다.
관련 링크: GreatSQL 커뮤니티 Gitee GitHub Bilibili
GreatSQL 커뮤니티:
커뮤니티 보상 제안 및 피드백: https://greatsql.cn/thread-54-1-1.html
커뮤니티 블로그 수상작 제출 세부정보: https://greatsql.cn/thread-100-1-1.html
(기사에 대해 궁금한 점이 있거나 남다른 통찰력이 있다면 공식 커뮤니티 홈페이지에 가서 질문하거나 공유해 보세요~)
기술교류그룹:
위챗 & QQ 그룹:
QQ 그룹: 533341697
WeChat 그룹: GreatSQL 커뮤니티 도우미(WeChat ID: wanlidbc
)를 친구로 추가하고 커뮤니티 도우미가 귀하를 그룹에 추가할 때까지 기다립니다.