7

私は大きなクエリを実行していて、比較のために前後に同じベースラインから実行したいと思っています。

私はmysqlクエリキャッシュについて知っていますが、2つのクエリはとにかくキャッシュされないため、私には関係ありません。

キャッシュされているのは、バッファープール内のinnodbページです。同じ開始点から2つのクエリを比較できるように、バッファプール全体をクリアする方法はありますか?

各クエリを実行した後にmysqlサーバーを再起動することは間違いなく機能しますが、可能であればこれを避けたいと思います

4

2 に答える 2

13

警告:以下は、MySQL5.5およびMySQL5.1.41+(InnoDBプラグイン)でのみ機能します。

次の設定を使用して、InnoDBバッファープールのエントリの期間をTweekします。

// This is 0.25 seconds
SET GLOBAL innodb_old_blocks_time=250; 
SET GLOBAL innodb_old_blocks_pct=5;
SET GLOBAL innodb_max_dirty_pages_pct=0;

テストが終了したら、デフォルトに戻します。

SET GLOBAL innodb_old_blocks_time=0;
SET GLOBAL innodb_old_blocks_pct=37;
SET GLOBAL innodb_max_dirty_pages_pct=90;
// 75 for MySQL 5.5/MySQL 5.1 InnoDB Plugin

これらの設定の定義を確認してください

于 2012-05-10T22:25:24.860 に答える
3

はるかに簡単です... これを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

于 2016-05-01T21:33:09.823 に答える