• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 1. InnoDB 소개
    2. InnoDB의 개념과 아키텍처
    3. InnoDB 구성
    4. InnoDB 관리
    5. InnoDB 테이블 스페이스 관리
    6. InnoDB 테이블 관리
    7. InnoDB 압축 테이블
    8. InnoDB 파일 형식 관리
    9. InnoDB Row Storage and Row Formats
    10. InnoDB 디스크 I/O 및 파일 영역 관리
    11. InnoDB와 온라인 DDL
    12. InnoDB 부팅 옵션 및 시스템 변수
    13. InnoDB의 성능
    1. InnoDB 버퍼 풀 구성
    2. InnoDB 상호 배타적 잠금 및 읽기 / 쓰기 잠금 구현
    3. InnoDB를위한 메모리 할당 구성
    4. InnoDB 변경 버퍼링 구성
    5. InnoDB의 스레드 병렬성 구성
    6. InnoDB 백그라운드 I/O 스레드 수 구성
    7. 그룹 커밋
    8. InnoDB 마스터 스레드의 I/O 속도의 구성
    9. InnoDB 스핀 루프에서 PAUSE 명령 사용
    10. 스핀 록 폴링 구성
    11. InnoDB의 MySQL 성능 스키마와 통합
    12. 다중 롤백 세그먼트에 의한 확장성 향상
    13. InnoDB 퍼지 스케줄링 구성
    14. InnoDB의 읽기 전용 트랜잭션 최적화
    15. 체크섬의 고속화를위한 CRC32 체크섬 알고리즘의 사용
    16. 옵티 마이저 통계
    17. InnoDB 테이블에 ANALYZE TABLE의 복잡성 추정
    14. InnoDB INFORMATION_SCHEMA 테이블
    15. InnoDB 모니터
    16. InnoDB 백업 및 복구
    17. InnoDB와 MySQL 복제
    18. InnoDB 및 memcached의 통합
    19. InnoDB 문제 해결
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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 의 모든 디스크에서 읽는 것은 없습니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved