データベースに何も変更せずに、私は非常に異なる行が自分のテーブルにカウントされています。phpmyadminの結果で推定される行数が非常に異なるのはなぜですか?
これはどうしてですか? MyISAMテーブルとは異なり
Server version: 5.1.63-cll
Engine: InnoDB
データベースに何も変更せずに、私は非常に異なる行が自分のテーブルにカウントされています。phpmyadminの結果で推定される行数が非常に異なるのはなぜですか?
これはどうしてですか? MyISAMテーブルとは異なり
Server version: 5.1.63-cll
Engine: InnoDB
、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