はるかに簡単... を実行して、この二回
SELECT SQL_NO_CACHE ...;
そして秒タイミングを見てください。
最初の人がbuffer_poolをウォームアップします。 2番目はSQL_NO_CACHE
を持つことによってQCを回避します。
したがって、2番目のタイミングは、ウォームキャッシュを備えた運用システムでの所要時間を示す良い指標です。
さらに、ハンドラでルック
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handlers%';
が触れている行数の合理的に明確なイメージを与えてカウントします。これは、クエリがどのくらいの労力を要しているか、良い感じを与えます。これは、小さなデータセットで非常に(そしてすばやく)正常に実行できることに注意してください。次に、より大きなデータセットに(しばしば)外挿することができます。
"Handler_read"は、インデックス行またはデータ行を読み取っている可能性があります。それは「次の」行(したがって、おそらく前の行のために読み込まれたブロックにキャッシュされているかもしれません)、またはランダムである可能性があります。つまり、この技法は、「必要なブロック数」にはあまり役立たない。
このHandlerの手法は、他に何が起こっているのかはわかりません。一貫した結果が得られます。
"Handler_write"は、tmpテーブルが必要であることを示します。
テーブル内の行数に近似する数値(またはその倍数)は、(おそらく)はテーブルスキャンを示します。 LIMIT
と同じ数値はLIMIT
を消費するような良いインデックスを作成することを意味します。となる場合があります。
あなたがBUFFER_POOLをフラッシュ行う場合は、ページが冷たいシステムで読むの数の正確な(?)のカウントを与えるためにInnodb_buffer_pool_reads
の変化を見ることができます。これには、ほとんど常にキャッシュされる非リーフインデックスページが含まれます。システム内で何か他のことが起こっている場合、この「STATUS
」の値は「セッション」ではなく「グローバル」なので信頼されてはなりません。
素晴らしい回答、ありがとうございます。私はちょうど質問があります...バッファページが期限切れになったとき、それは単に削除されたとフラグが立てられていますか?私はちょうど期限切れのバッファページを定期的にプルーンする(また、タイムアウトが非常に低いために潜在的にデータベースに大きな負荷をかける)innodbスレッドがないことを確認したい。 ---私はテストのための唯一の一時的なことを知っていますが、私はこれらの特定のベンチマークで良い処理をする必要があります – carpii
@Rolando、私はできるだけ少ないRAMを使用するためにMySQLを必要と実行する多くの他のプログラムがある場合、 innodbバッファプールをゼロに設定する必要がありますか?または、必要最小限の金額がありますか? – Pacerier