@RemusRusanu에 동의합니다 (대답에 +1).
SELECT COUNT(*) FROM mydb.mytable
InnoDB에서는 트랜잭션 스토리지 엔진처럼 작동합니다. MyISAM과 비교하십시오.
MyISAM
경우 mydb.mytable
MyISAM 테이블이며, 출시는 SELECT COUNT(*) FROM mydb.mytable;
단지 실행과 같다 SELECT table_rows FROM information_schema.table WHERE table_schema = 'mydb' AND table_name = 'mytable';
. MyISAM 테이블의 헤더에서 행 수를 빠르게 조회합니다.
InnoDB
mydb.mytable
InnoDB 테이블 인 경우 진행중인 작업이 발생합니다. 다음을 관리하는 MVCC가 진행 중입니다.
- ib_logfile0 / ib_logfile1 (다시 실행 로그)
- ibdata1
- 버퍼 풀 관리
- 트랜잭션 격리 (4 가지 유형)
- 반복 가능한 읽기
- 커밋 된 읽기
- 커밋되지 않은 읽기
- 직렬화 가능
InnoDB에 테이블 수를 요청하면 이러한 불길한 것들을 탐색해야합니다. 실제로, SELECT COUNT(*) from mydb.mytable
반복 가능한 읽기만을 카운트 하는지 또는 커밋 된 읽기 및 커밋되지 않은 읽기를 포함 하는지 실제로 알지 못합니다 .
innodb_stats_on_metadata 를 활성화하여 약간의 안정화를 시도 할 수 있습니다.
innodb_stats_on_meta_data 의 MySQL 문서에 따르면
이 변수가 활성화되면 (변수가 생성되기 전의 기본값) InnoDB는 SHOW TABLE STATUS 또는 SHOW INDEX와 같은 메타 데이터 문 또는 INFORMATION_SCHEMA 테이블 TABLES 또는 STATISTICS에 액세스 할 때 통계를 업데이트합니다. (이 업데이트는 ANALYZE TABLE의 경우와 유사합니다.) 비활성화하면 InnoDB는 이러한 작업 중에 통계를 업데이트하지 않습니다. 이 변수를 비활성화하면 테이블 또는 인덱스가 많은 스키마의 액세스 속도가 향상 될 수 있습니다. 또한 InnoDB 테이블과 관련된 쿼리에 대한 실행 계획의 안정성을 향상시킬 수 있습니다.
이 기능을 비활성화하면 EXPLAIN 계획 설정 측면에서보다 안정적인 수를 제공하거나 제공하지 않을 수 있습니다. SELECT COUNT(*) from mydb.mytable
좋은 방법, 나쁜 방법 또는 전혀 성능에 영향을 줄 수 있습니다 . 시도하고 참조하십시오!