AWSブログにて、RDS MySQLにおけるキャシュウォーミングがサポートされました。
http://aws.typepad.com/aws_japan/2014/09/rds-mysql-cache-warming.html
で、キャッシュウォーミングってなんぞやということですが、上記ブログから抜粋させてもらうと。
MySQLを実行しているAmazon RDSのDBインスタンスをシャットダウンする際、バッファープールの状態を保存し、後でインスタンスを起動する際に、リロードするよう設定することができます。 インスタンスはウォームアップを必要とせずに、効率的な方法で、一般的なクエリを処理できるようになります。
う~ん、私の知る限りでは、RDSはシャットダウンは出来ないはずですが(EC2と異なり、Stopという概念がありません。つまり稼働か削除のいずれかで、削除する場合は、スナップショットをとっておきます。)どこで生きてくるのだろう?と思いましたが、パターンとしてはパラメータセットを変更したり、マイナーアップグレードが走った時に、MySQLは確実にリブートしているはずなので、その時にうまみが有ります。
この機能のついて少し掘り下げます。
MySQLとくにInnoDBは、バッファ/キャッシュの設定がパフォーマンスに大きく出ます。このキャッシュはメモリに保存されるので、簡単に言うと、メモリをきちんと使いきらないと損だということです。で、このキャッシュですが、当然 mysqldの再起動が行われると、削除されます。再起動後にクエリが走った時に、再度キャッシュされることになりますが、この一発目の問い合わせは遅くなってしまいます。これを何とかしようというわけです。
つまり、シャットダウン直前に、バッファ/キャッシュをディスクにDumpして、起動時にそのDumpファイルをメモリにロードするというわけです。早速試してみます。
とりあえず、そこそこ大きなレコード数のテーブルを作ってください。50万レコード位のものをつくり、インデックスをつけて count(*) するだけの環境で試しました。大量レコードの作製方法は、2つテーブルを作り、JoinやWhere条件を付けずに2つのテーブルから create xxx (select xxx) で表を作ればあっという間です。
キャッシュウォーミングの無いとき。下記はリブート直後の状態で検証しました。
mysql> select count(*) from imatest_hoge where hoge='aaa'+----------+
| count(*) |
+----------+
| 10772 |
+----------+
1 row in set (0.27 sec)
mysql> select count(*) from imatest_hoge where hoge='aaa'
+----------+
| count(*) |
+----------+
| 10772 |
+----------+
1 row in set (0.01 sec)
一発目はキャッシュが効いていないので遅いです。
では早速、パラメータグループを作り、キャッシュウォーミングの設定をします。
キャッシュウォーミングの有るとき。一回Selectした後に、リブートしました。
mysql> select count(*) from imatest_hoge where hoge='aaa'+----------+
| count(*) |
+----------+
| 10772 |
+----------+
1 row in set (0.03 sec)
mysql> select count(*) from imatest_hoge where hoge='aaa'
+----------+
| count(*) |
+----------+
| 10772 |
+----------+
1 row in set (0.01 sec)
こちらは一発目からキャッシュが効いているので速いです。さすがに二発連続と同じ速さでは無いですが。
それほど劇的な効果が期待できるわけではないですが、やっておいて損はないので、設定しておくことをオススメします。