[+/-]
クエリキャッシュには、SELECT
ステートメントのテキストを、クライアント送信の関連結果を合わせて格納します。あとでまったく同じクエリーを受け取ると、サーバーはそのクエリーの解析と実行を繰り返す代わりに、クエリキャッシュから結果を取り出します。クエリーキャッシュはセッション間で共有されるため、1
つのクライアントで生成された結果セットを、別のクライアントから発行された同じクエリーに対して応答として送信できます。
テーブルの一部を頻繁には変更することがなく、同じクエリーを何度も実行するような環境では、クエリキャッシュが非常に役立ちます。動的コンテンツを大量に持つ多くの Web サーバーでは、このような状況が一般的です。
クエリキャッシュから古いデータが返ることはありません。データ変更があると、クエリキャッシュに関連するエントリをすべてフラッシュします。
複数の mysqld
サーバーで同一の
MyISAM
テーブルを更新している環境では、クエリキャッシュは機能しません。
MySQL 5.1.17 以降、項4.5.5.1. 「クエリキャッシュの動作」に説明されている条件の下で、クエリーキャッシュは準備済みステートメントに使用されます。5.1.17 より前では、クエリーキャッシュは準備済みステートメントに使用されません。
クエリキャッシュのパフォーマンスに関するデータの一部を次に示します。これらの結果は、2GB の RAM、64MB のクエリーキャッシュを搭載する Linux Alpha 2×500MHz での MySQL ベンチマークスイートの実行により生成したものです。
レコードが 1 つしかないテーブルからレコードを 1 つ選択する場合など、実行しているクエリーが単純であるに関わらず、互いに異なることが原因で、クエリーをキャッシュすることができないときは、クエリキャッシュをアクティブにしておくことによるオーバーヘッドは 13% になる。これは最悪の場合のシナリオと見なすことができる。現実には、クエリーはこの例よりもはるかに複雑なため、通常オーバーヘッドはかなり低くなる。
レコードが 1 つだけのテーブルでの 1 つのレコードの検索では、238% 迅速化する。これは、キャッシュに格納してるクエリーで想定している迅速化の最小値に近い数値である。
サーバーの起動時にクエリーキャッシュを無効にするには、query_cache_size
システム変数を 0
に設定します。クエリーキャッシュコードを無効にすると、目立ったオーバーヘッドはなくなります。MySQL
をソースから建てている場合、--without-query-cache
オプションで configure
を呼び出し、クエリキャッシュをコードから除外できる。
クエリーキャッシュを使用すると、パフォーマンスをかなり改善できる可能性がありますが、すべての場合にそうなるとはかぎりません。クエリーキャッシュの設定やサーバーの作業負荷によっては、実際にはパフォーマンスが低下することもあります。
クエリーキャッシュのサイズを大きくしすぎると、キャッシュの保守のために必要なオーバーヘッドが増え、キャッシュを有効にする利点が打ち消されることがあるので注意してください。通常は数十メガバイトのサイズが適切です。数百メガバイトのサイズは適切でない場合があります。
サーバーの作業負荷は、クエリーキャッシュの効率にかなりの影響を与えます。ほぼ全体が固定の
SELECT
ステートメントで構成される複合クエリーの場合、頻繁に使用される
INSERT
ステートメントによってキャッシュ内の結果が絶えず無効にされるような複合クエリーの場合よりも、キャッシュを有効にすることで利点が得られる可能性が高くなります。場合によっては、SQL_NO_CACHE
オプションを使用して、頻繁に変更されるテーブルを使用する
SELECT
ステートメントの場合に結果をキャッシュに入れないようにする回避方法が使用できます。詳細は、項4.5.5.2. 「クエリキャッシュでの
SELECT
オプション」
を参照してください。
クエリーキャッシュを使用することで利点が得られるかどうかを確認するには、キャッシュを有効にした状態と無効にした状態で MySQL サーバーの動作をテストします。サーバーの作業負荷が変わるとクエリーキャッシュの効率も変化する可能性があるため、その後、このテストを定期的に繰り返します。