質問: 10億レコードのテーブルからの単純な抽出を検討しています。 <tagmapテーブル> id int tag_id int idが振られている記事(1000万レコード)に対して1記事あたり100個のタグ付けを行っている想定のテーブルです。 タグ数(tag_id)は100万程度です。 SELECT id FROM tagmap WHERE tag_id=xxxxx; の検索結果が、 初回 10000 rows in set (1.85 sec) 2回目 10000 rows in set (0.00 sec) という具合で、キャッシュを使っていると思われる2回目が劇的に改善します。 WHERE句を変えると、やはり初回は1~2sec、2回目は0.00~0.01secで返ってきます。 初回のパフォーマンスのこれ以上のチューニングが難しく(パーティションなどが使いづらい)、何とか事前計算などでユーザーには最初から2回目のパフォーマンスを提供したいのですが、再起動時などに全ての抽出クエリのキャッシュをメモリに載せて、それを維持しておくことは可能でしょうか。 手順や必要なメモリ量の見積もりがわかる方がいれば教示いただけますでしょうか。 抽出パターンは単純なtag_idとして100万通りです。 (AND検索などはプログラムで絞り込む、または1~2secかけて抽出で構いません) tagmapテーブルはファイルを見たところ約1GBのディスク量です。 サーバーのメモリは128GBなどは用意できるので、再起動時などに全てメモリに載せられれば、と考えています。
回答: キャッシュだけってのは多分簡単にはできません。そこで、キャッシュを持ち越す方法としては、 1.OSごと仮想化して仮想化環境の機能を使って再起動前の状態で続行する。 これだとMySQLの再起動時には意味がないので、 2.MySQL再起動時に想定したクエリを事前に発行する。 単に早ければいいなら、 3.もっと速い環境に変更する。(MEMORY ストレージエンジン,MySQL Clusterなど) 全て併用可能です。