2012-08-12 7 views

답변

37

enter image description here

MyISAM 테이블과는 달리, InnoDB 테이블은 테이블에 포함 된 행 수를 추적하지 않습니다.

이 때문에, InnoDB 테이블의 정확한 행 수를 알 수있는 유일한 방법은 테이블의 각 행을 검사하여 개수를 누적하는 것입니다. 따라서 큰 InnoDB 테이블에서 SELECT COUNT(*) FROM innodb_table 쿼리를 수행하는 것은 전체 테이블 스캔을 수행하여 행 수를 얻기 때문에 매우 느릴 수 있습니다.

phpMyAdmin은 SHOW TABLE STATUS과 같은 쿼리를 사용하여 엔진 (InnoDB)에서 테이블의 행 수를 추정합니다. 견적 일 뿐이므로 전화를 걸 때마다 다릅니다. 때로는 유사 함이 상당히 클 수 있으며 때로는 유사합니다.

여기 Percona의 COUNT(*) for InnoDB tables에 대한 유용한 블로그 게시물이 있습니다.

MySQL의 매뉴얼 페이지 SHOW TABLE STATUS에 대한 상태 : 행의

수입니다. MyISAM과 같은 일부 스토리지 엔진은 정확한 숫자 인 을 저장합니다. InnoDB와 같은 다른 스토리지 엔진의 경우이 값은 대략 이며 실제 값과 40 에서 50 %까지 다를 수 있습니다. 그러한 경우 SELECT COUNT (*)를 사용하여 정확히 카운트를 얻으십시오. InnoDB restrictions

페이지는 좀 더 내용이수록 :

SHOW TABLE STATUS는, 테이블에 의해 확보가 된 물리적 인 크기를 제외하고, InnoDB 테이블에 정확한 통계를 제공하지 않습니다. 행 수는 SQL 최적화에 사용 된 대략적인 추정치 일뿐입니다. 동시 트랜잭션이 동시에 행의 다른 번호 "를 참조하십시오"수도 있기 때문에

InnoDB는 테이블의 행의 내부 카운트를 유지하지 않습니다. SELECT COUNT(*) FROM t 문장을 처리하기 위해서, InnoDB는 테이블의 인덱스를 으로 스캔한다. 인덱스가 이 버퍼 풀에 완전히없는 경우에는 시간이 걸린다. 테이블이 자주 변경되지 않으면MySQL 쿼리 캐시를 사용하는 것이 좋습니다. 빠른 카운트를 얻으려면 자신이 만든 카운터 테이블을 사용해야하며 삽입 및 삭제에 따라 응용 프로그램을 업데이트해야합니다. 대략적인 행 수가 충분하면 SHOW TABLE STATUS을 사용할 수 있습니다. 섹션 14.3.14.1, “InnoDB Performance Tuning Tips”을 참조하십시오.

+7

중요한 점은 ** 'SHOW TABLE STATUS'가 어떻게 추정합니까? – Pacerier

4

phpMyAdmin은 행 개수를 얻기 위해 빠른 방법을 사용하며이 방법은 InnoDB 테이블의 경우 대략적인 개수 만 반환합니다.

해당 결과를 수정하는 방법은 $cfg['MaxExactCount']을 참조하십시오.하지만 성능에 심각한 영향을 미칠 수 있습니다.

관련 문제