2012-05-10 3 views
5

私は大きなクエリをチューニングしており、比較のため前後の同じベースラインから実行したいと考えています。mysql innodbバッファプールをクリア/フラッシュする方法は?

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

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

は、各クエリを実行した後MySQLサーバを再起動する一方で、Idはこの可能であれば

答えて

8

警告を避けるために、間違いなく仕事が好きないだろう:次はMySQLの5.5とMySQLのために働く5.1.41+(InnoDBのプラグイン)

これらの設定ではInnoDBのバッファプール内のエントリの期間をTweek:

SET GLOBAL innodb_old_blocks_time=250; // This is 0.25 seconds 
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 

これらの設定の定義を確認し

+0

素晴らしい回答、ありがとうございます。私はちょうど質問があります...バッファページが期限切れになったとき、それは単に削除されたとフラグが立てられていますか?私はちょうど期限切れのバッファページを定期的にプルーンする(また、タイムアウトが非常に低いために潜在的にデータベースに大きな負荷をかける)innodbスレッドがないことを確認したい。 ---私はテストのための唯一の一時的なことを知っていますが、私はこれらの特定のベンチマークで良い処理をする必要があります – carpii

+0

@Rolando、私はできるだけ少ないRAMを使用するためにMySQLを必要と実行する多くの他のプログラムがある場合、 innodbバッファプールをゼロに設定する必要がありますか?または、必要最小限の金額がありますか? – Pacerier

2

はるかに簡単... ​​を実行して、この二回

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」の値は「セッション」ではなく「グローバル」なので信頼されてはなりません。

関連する問題