Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  MySQL クエリーキャッシュ

8.9.3 MySQL クエリーキャッシュ

クエリーキャッシュには、クライアントに送信された対応する結果とともに、SELECT ステートメントのテキストが格納されます。あとで同じステートメントを受け取った場合、サーバーはそのステートメントを再度解析して実行する代わりに、クエリーキャッシュから結果を取得します。クエリーキャッシュはセッション間で共有されるため、1 つのクライアントで生成された結果セットを、別のクライアントによって発行された同じクエリーへの応答で送信できます。

クエリーキャッシュは、あまり頻繁に変更されないテーブルがあり、それに対してサーバーが多くの同一のクエリーを受け取る環境で役立つことがあります。これは、データベースの内容に基づいて、多くの動的ページを生成する多くの Web サーバーに一般的な状況です。

クエリーキャッシュは古くなったデータを返しません。テーブルが変更されると、クエリーキャッシュ内の関連エントリがフラッシュされます。

注記

同じ MyISAM テーブルを更新する複数の mysqld サーバーがある環境では、クエリーキャッシュは機能しません。

クエリーキャッシュは、セクション8.9.3.1「クエリーキャッシュの動作」に説明された条件の下で、準備されたステートメントに使用されます。

注記

MySQL 5.6.5 現在、クエリーキャッシュは、パーティション化されたテーブルに対してはサポートされておらず、パーティション化されたテーブルを含むクエリーには自動的に無効にされます。そのようなクエリーに対しては、クエリーキャッシュを有効にできません。(Bug #53775)

クエリーキャッシュの一部のパフォーマンスデータを次に示します。これらの結果は、2G バイトの RAM と 64M バイトのクエリーキャッシュを搭載する Linux Alpha 2 × 500MHz システムで、MySQL ベンチマークスイートを実行して生成されました。

  • 実行しているすべてのクエリーは単純です (1 行のテーブルから行を選択するなど) が、それでも異なっているため、クエリーをキャッシュできない場合、クエリーキャッシュをアクティブにしておくためのオーバーヘッドは 13% です。これは最悪のケースのシナリオとみなすことができます。実際には、クエリーははるかに複雑になる傾向があるため、オーバーヘッドは通常かなり低くなります。

  • 単一行テーブル内の単一行の検索は、クエリーキャッシュがあると、それがない場合より、238% 高速化します。これは、キャッシュされているクエリーに予想される最小の高速化に近いとみなすことができます。

サーバーの起動時にクエリーキャッシュを無効にするには、query_cache_size システム変数を 0 に設定します。クエリーキャッシュコードを無効にすることによって、目立ったオーバーヘッドはなくなります。

クエリーキャッシュは、かなりのパフォーマンスの改善の可能性を提供しますが、すべての環境でそうなるものと想定しないでください。クエリーキャッシュの構成やサーバーのワークロードによっては、実際にパフォーマンスの低下が見られることもあります。

  • クエリーキャッシュのサイズを過度に大きくすると、キャッシュの保守に必要なオーバーヘッドが増え、それを有効にすることのメリットに勝る可能性があります。数十メガバイトのサイズが通常は有益です。数百メガバイトのサイズはそうでない可能性があります。

  • サーバーのワークロードは、クエリーキャッシュの効率にかなりの影響を与えます。ほぼ全体が固定の SELECT ステートメントのセットで構成される複合クエリーでは、頻繁な INSERT ステートメントによってキャッシュ内の結果が絶えず無効にされるような複合クエリーよりも、キャッシュを有効にすることでメリットが得られる可能性がはるかに高くなります。場合によっては、回避方法として、SQL_NO_CACHE オプションを使用して、頻繁に変更されるテーブルを使用する SELECT ステートメントに対して、結果をキャッシュに入れないようにします。(セクション8.9.3.2「クエリーキャッシュ SELECT オプション」を参照してください。)

クエリーキャッシュを使用することでメリットがあるかどうかを確認するには、キャッシュを有効および無効にして MySQL サーバーの動作をテストします。サーバーのワークロードが変わるとクエリーキャッシュの効率も変わることがあるため、その後、定期的に再テストします。