@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テーブルで、あなたは物事のホッジ-podgeが起こってもらいます。次を管理する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
良い影響、悪い影響、またはまったく影響しない可能性があります。試してみてください!!!