はるかに簡単です... これを2回実行します
SELECT SQL_NO_CACHE ...;
そして、2番目のタイミングを見てください。
最初のものはbuffer_poolをウォームアップします。2つ目は、を使用してQCを回避しSQL_NO_CACHE
ます。(MySQL 8.0では、省略しSQL_NO_CACHE
ます;それはなくなりました。)
したがって、2番目のタイミングは、ウォームキャッシュを備えた本番システムでかかる時間を示す良い指標です。
さらに、ハンドラー数を見てください
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handlers%';
タッチされた行の数をかなり明確に示します。これにより、クエリにかかる労力を正確に把握できます。これは、小さなデータセットで非常に正常に(そして迅速に)実行できることに注意してください。次に、(多くの場合)より大きなデータセットに外挿することができます。
「Handler_read」は、インデックス行またはデータ行を読み取っている可能性があります。これは、「次の」行(したがって、前の行で読み取られたブロックにキャッシュされている可能性があります)であるか、ランダムである可能性があります(したがって、別のディスクヒットの対象となる可能性があります)。つまり、この手法は「必要なブロック数」にはあまり役立ちません。
このハンドラー手法は、他に何が起こっているかに影響されません。一貫した結果が得られます。
「Handler_write」は、tmpテーブルが必要であることを示します。
テーブル内の行数(またはその倍数)を概算する数値は、おそらくテーブルスキャンを示します。と同じ数値は、それ自体に消費されるほど優れたインデックスを作成することを意味する場合がありLIMIT
ますLIMIT
。
buffer_poolをフラッシュする場合は、変更を監視して、コールドシステムInnodb_buffer_pool_reads
で読み取られたページ数の正確な(?)カウントを取得できます。これには、ほとんどの場合キャッシュされる非リーフインデックスページが含まれます。システムで他に何かが起こっている場合、この値は「セッション」ではなく「グローバル」であるため、信頼されるべきではありません。STATUS