sql >> データベース >  >> RDS >> Mysql

phpmyadminの結果で推定行数が大きく異なるのはなぜですか?

    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パフォーマンス」を参照してください。チューニングのヒント」



    1. OracleデータベースのLIMIT句を使用したPL/SQL一括収集

    2. Oracleはエラー時にトランザクションをロールバックしますか?

    3. T-SQLを使用して、文字列からn番目に区切られた要素を返します

    4. SQL ServerProfilerでのexecsp_reset_connectionはどういう意味ですか?