2011-08-15 3 views
8

enter image description hereInnoDB 테이블에서 오버 헤드와 효과적인 문제를 해결하는 방법은 무엇입니까?

질문 :

1 - 오버 헤드 무슨 뜻입니까? MyISAM 테이블에서 "테이블 최적화"버튼을 클릭하면 오버 헤드 및 유효 데이터가 사라집니다. 나는 그것이 내 테이블에 무슨 일을하는지 궁금해?

2 - 실제로 오버 헤드와 유효 가치를 고려해야합니까? InnoDB 테이블에서 오버 헤드와 효과적인 문제를 해결하는 방법은 무엇입니까?

답변

8

InnoDB를 고정하는 것은 버튼 클릭처럼 간단하지 않습니다. MyISAM입니다.

  • 하면 임시 테이블
  • 드롭으로 mytb로 mytb에서
  • 복사의 MyISAM 데이터를 동일한 구조 빈 임시 테이블을 만듭니다 후드에서

    , OPTIMIZE TABLE은 MyISAM 테이블에라는 mytb을이 작업을 수행 할 것 테이블 mytb
  • 이름 바꾸기 임시 테이블은 mytb 저장 지수 통계에
  • 실행 ANALYZE TABLE을 mytb하는
  • ,536,913,632

    이유 # 1 : 이노 스토리지 레이아웃이 기본적으로

    , 이노을 사용할 수 innodb_file_per_table을 가지고 10

OPTMIZE 표는 두 가지 이유로 이노와 그런 식으로 작동하지 않습니다. InnoDB와 그 할머니는 ibdata1에 도착합니다.

  • 하는 mytb과 동일한 구조의 임시 테이블
  • 드롭 테이블 mytb
  • 에 mytb에서
  • 복사 InnoDB의 데이터와 빈 이노 임시 테이블 만들기 : mytb라는 InnoDB의 테이블에 다음과 OPTIMIZE 표를 않습니다 실행 임시 테이블은
  • 실행이 mytb 저장 지수 통계에 테이블을 분석 mytb하기 위해 이름을 변경

불행하게도, mytb 축소에 사용되는 임시 테이블이 ibdata1에 추가됩니다. 즉시 성장 ibdata1에 대한 !!! 이 점에서 ibdata1은 결코 줄어들지 않습니다. 설상가상으로, ANALYZE TABLE은 쓸모가 없다. (이유 # 2에서 설명했다.)

innodb_file_per_table이 활성화되어 있으면 데이터가 ibdata1에 저장되어 있지 않지만 처음 4 단계가 작동하지만 외부 테이블 스페이스 파일 mytb.ibd. 그것은 줄어들 수 있습니다.

이유 # 2 : 인덱스 통계는 항상 효율적으로 인덱스 통계를 저장하지 않습니다

이노

을 다시 계산된다. 사실 mytb에서 ANALYZE TABLE을 실행하면 통계가 작성되어 저장됩니다. 안타깝게도 InnoDB는 guessimate 주요 카디널리티 인덱스의 BTREE 페이지로 들어가서 그 숫자를 사용하여 MySQL Query Optimizer를 작성합니다. 이것은 진행중인 과정입니다. 결과적으로 계산 된 인덱스 통계는 해당 테이블에 대해 실행 된 각 쿼리로 덮어 쓰므로 ANALYZE TABLE은 쓸모가 없습니다. I wrote about this in the DBA StackExchange June 21, 2011. 오버 헤드의 MyISAM로서는

Percona explained this thoroughly in www.mysqlperformanceblog.com

, 즉 숫자가 파악 될 수있다.

MyISAM 테이블의 경우 오버 헤드는 내부 조각화를 나타냅니다. 특히 BLOB 데이터 나 VARCHAR 열이있는 경우 이는 경험, INSERT, UPDATE 및 DELETE가있는 테이블에서 매우 일반적입니다. OPTIMIZE TABLE을 실행하면 임시 테이블 (자연스럽게 빈 공간을 복사하지 않음)에 복사하여 그러한 단편화가 사라집니다.

InnoDB로 돌아가서 낭비 공간을 어떻게 효과적으로 제거합니까? 적은 정보를 유지하려면 ibdata1을 다시 설계해야합니다.

  • 테이블 데이터 페이지
  • 색인 데이터 페이지를
  • 테이블 메타 데이터
  • MVCC 데이터 트랜잭션

당신은 permamnently 테이블 및 인덱스를 밖으로 이동할 수 있습니다에 대한 : 당신은 데이터의 네 가지 유형을을 ibdata1 withing에 영원히 ibdata1. ibdata1에 이미 저장된 데이터 및 색인은 어떻게됩니까?

내가 10 월 29, 게시 2010 년 InnoDB의 정리 계획에 따라 : Howto: Clean a mysql InnoDB storage engine? 당신이 그것을해야 할 경우, 데이터베이스가 토스트가 이미 있기 때문에 "OPTIMIZE 표가"의 MyISAM에 시간의 쓸모없는 낭비입니다 사실

+0

아무 것도 업데이트 나 삽입 또는 삭제하지 않았고, myisam을 innodb로 변경 한 다음 오버 헤드 값이 3,072.0KiB까지 올라 갔으며 유효 값은 -3,129,344로 떨어졌습니다. 정상입니까? 아니면 실제로 오버 헤드/효과적인 문제를 방지하기 위해 innodb 변경 myisam 전에 뭔가를 설정해야합니까? – zac1987

+0

@ zac1987이 답장은 조금 늦은 것 같지만, InnoDB로 바꾸기 전에 OPTIMIZE TABLE을 시도해 볼 수 있습니다. – Raptor

1

.

큰 테이블에서는 매우 오랜 시간이 걸리고 테이블에 대한 쓰기 액세스는 차단됩니다. 또한, 그것은의 MyISAM keycache 등

그래서 요약

  • 작은 테이블이 "테이블을 최적화"사용하지 않을 수 있습니다
  • 대형 테이블 "테이블을 최적화 할"필요가 없습니다 (또는 참의 MyISAM에 매우 불쾌한 효과가있다)

스키마 변경을하지 않는 ALTER TABLE 문 (일반적으로 ALTER TABLE t ENGINE = InnoDB)을 사용하여 InnoDB에서 동일한 작업을 간단히 수행 할 수 있습니다. 그것은 MyISAM만큼 빠르지 않습니다. 왜냐하면 다양한 작은 테이블에서 메모리에 최적화 된 최적화를 수행하지 않기 때문입니다.

MyISAM은 인덱스 최적화를 통해 인덱스 페이지를 압축합니다. 인덱스 페이지를 압축하면 일반적으로 인덱스가 매우 작아집니다. InnoDB는 이것도 가지고 있지 않습니다.

데이터베이스가 작 으면 필요하지 않습니다. 크기가 클 경우 어차피 MyISAM을 사용할 수 없다. (예기치 않은 시스템 종료로 인해 테이블을 재구성해야하기 때문에 대형 테이블에서 너무 오래 걸린다.) 내구성, 안정성, 트랜잭션, 모든 동시성 수준이 필요하거나 일반적으로 어떤 방식 으로든 견고성에 관심이 있다면 MyISAM을 사용하지 마십시오.

+0

실제로 실제로 오버 헤드와 효과적인 문제를 신경 쓸 필요가 없습니까?오버 헤드 필드에 붉은 색 값이 표시됩니까? – zac1987

관련 문제