데이터베이스에 아무런 변화가 없으면 테이블의 행 수가 달라집니다.phpmyadmin 결과에서 예상 행 수가 매우 다른 이유는 무엇입니까?
어떻게 될 수 있습니까?
Server version: 5.1.63-cll
Engine: InnoDB
데이터베이스에 아무런 변화가 없으면 테이블의 행 수가 달라집니다.phpmyadmin 결과에서 예상 행 수가 매우 다른 이유는 무엇입니까?
어떻게 될 수 있습니까?
Server version: 5.1.63-cll
Engine: InnoDB
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”을 참조하십시오.
phpMyAdmin은 행 개수를 얻기 위해 빠른 방법을 사용하며이 방법은 InnoDB 테이블의 경우 대략적인 개수 만 반환합니다.
해당 결과를 수정하는 방법은 $cfg['MaxExactCount']
을 참조하십시오.하지만 성능에 심각한 영향을 미칠 수 있습니다.
중요한 점은 ** 'SHOW TABLE STATUS'가 어떻게 추정합니까? – Pacerier