« DBIx::Printf と LIKE 式 | メイン | メッセージキュー事始め in Perl - コマンドラインクライアントを作ってみた »

2007年10月11日

MySQL のウォームアップ (InnoDB編)

 サーバの起動直後はデータがメモリ上にないためデータベースの応答速度が遅い、というのは良く知られた話かと思います。MySQL の場合、使っているエンジンが MyISAM であれば、各データファイルをあらかじめ cat ... > /dev/null するなりしてバッファキャッシュに載せておけばいいのですが、InnoDB は独自のキャッシュを持っているのでそういうわけにもいかないように思います。

 具体的には、パフォーマンスを最大限発揮するためには OS のキャッシュにではなく、InnoDB のバッファプールにデータをロードすべきであるという点。それに、たとえ OS のキャッシュを利用するので良しとするケースでも、サーバの実メモリの過半をバッファプールに使用しているような場合だと、バッファプールを確保するために OS のキャッシュにロードしたデータが破棄されるケースが出てくるという点が、問題となるのではないでしょうか。

 じゃあどうすんべ、とお風呂の中で考えた結果、以下の案にたどり着きました。たぶんこの手順で問題ないと思うのですが、間違いがあればツッコミを入れていただければ幸いです。

手順1. プライマリインデックスをキーにして全行をロード

select sum(primary_key) from tbl;

 InnoDB はクラスタードインデックスなので、これで全データがバッファプールにロードされるはずです。プライマリキーが文字列の場合は sum(length(primary_key)) のようにすればいいと思います。

手順2. 各インデックスをロード

select sum(key) from (select key from tbl order by key) as t1;

 テーブルを各インデックスを使って全読み込みします。もっと簡単な SQL でもキーを使ってくれそうな感じもします。このあたりは、MySQL のバージョンによっても挙動が異なるかもしれませんし、explain の結果を見ながら調整すればいいでしょう。

 以上を各テーブルについて繰り返せばいいのかな、と思いました。もっと簡単な方法があったりするんじゃないかという気もしますが、まあこういう理解であっているんですかね。

投稿者 kazuho : 2007年10月11日 22:44 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1586

このリストは、次のエントリーを参照しています: MySQL のウォームアップ (InnoDB編):

» [MySQL][チューニング]Re: MySQL のウォームアップ (InnoDB編) from 浅く広くをモットーに - WEBプログラマ メモ
http://labs.cybozu.co.jp/blog/kazuho/archives/2007/10/innodb_warmup.php#more... [続きを読む]

トラックバック時刻: 2008年02月19日 11:42