MyISAMテーブルとは異なり、InnoDBテーブルはテーブルに含まれる行数を追跡しません。
このため、InnoDBテーブルの正確な行数を知る唯一の方法は、テーブルの各行を検査してカウントを累積することです。したがって、大きなInnoDBテーブルでは、SELECT COUNT(*) FROM innodb_table
を実行します。 行数を取得するために全表スキャンを実行するため、クエリは非常に遅くなる可能性があります。
phpMyAdminは、SHOW TABLE STATUS
のようなクエリを使用します エンジン(InnoDB)からテーブル内の行数の推定カウントを取得します。これは単なる見積もりであるため、呼び出すたびに変動します。変動がかなり大きい場合もあれば、近い場合もあります。
これは、 COUNT(*)に関する有益なブログ投稿です。 InnoDBテーブル Perconaによる。
テーブルステータスの表示> 状態:
行数。 MyISAMなどの一部のストレージエンジンは、正確なカウントを保存します。 InnoDBなどの他のストレージエンジンの場合、この値は概算値であり、実際の値から40〜50%も異なる場合があります。このような場合は、SELECT COUNT(*)を使用して正確なカウントを取得してください。
InnoDBの制限 のページ さらに詳しく説明します:
SHOW TABLE STATUSは、テーブルによって予約されている物理サイズを除いて、InnoDBテーブルの正確な統計を提供しません。行数は、SQL最適化で使用される概算です。
同時トランザクションが同時に異なる数の行を「見る」可能性があるため、InnoDBはテーブル内の行の内部カウントを保持しません。
SELECT COUNT(*) FROM t
を処理するには ステートメント、テーブルのInnoDB scansanインデックス。これは、インデックスが完全にバッファープールにない場合は時間がかかります。テーブルが頻繁に変更されない場合は、MySQLクエリキャッシュを使用することをお勧めします。迅速にカウントするには、自分で作成したカウンターテーブルを使用し、挿入と削除に応じてアプリケーションに更新させる必要があります。おおよその行数で十分な場合は、SHOW TABLE STATUS
使用できます。セクション14.3.14.1、「InnoDBパフォーマンス」を参照してください。チューニングのヒント」 。