2012-08-12 11 views

答えて

37

、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']を参照してください。ただし、これがパフォーマンスに重大な影響を与える可能性があります。

関連する問題