MySQL 5.1 リファレンスマニュアル :: 4 データベース管理 :: 4.13 MySQL クエリ キャッシュ :: 4.13.3 クエリ キャッシュの設定
« 4.13.2 クエリ キャッシュでの SELECT オプション

4.13.4 クエリ キャッシュのステータスと保守 »
Section Navigation      [Toggle]
  • 4.13 MySQL クエリ キャッシュ
  • 4.13.1 クエリ キャッシュの動作
  • 4.13.2 クエリ キャッシュでの SELECT オプション
  • 4.13.3 クエリ キャッシュの設定
  • 4.13.4 クエリ キャッシュのステータスと保守

4.13.3. クエリ キャッシュの設定

have_query_cache というサーバのシステム変数は、クエリ キャッシュの利用可能にします。

mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

MySQL 標準バイナリを使用しているときは、この値は常に、YES です。クエリ キャッシュを無効化している場合も同様です。

システム変数によっては、クエリ キャッシュのオペレーション制御を行います。mysqld 起動時に、オプション ファイルやコマンドラインで指定できます。クエリ キャッシュのシステム変数名はすべて、query_cache_ という文字で始まります。これに関する簡単な説明を 項4.2.3. 「システム変数」 で参照してください。このセクションでは、設定に関する情報を提供します。

クエリ キャッシュのサイズを設定するには、query_cache_size システム変数を使用します。値を 0 にすると、クエリ キャッシュは無効化します。デフォルトは 0 で設定しています。

注意

Windows Configuration Wizard を使用して、MySQL をインストールまたは設定するときは、利用可能なコンフィギュレーションの種類に合わせて、自動的に query_cache_size の値をデフォルト設定します。Windows Configuration Wizard を使用するときは、場合によって、クエリ キャッシュが有効化します。つまり、ゼロではない値になることがあります。クエリ キャッシュの制御は、query_cache_type 変数で行います。コンフィギュレーションを始めるときには、my.ini ファイルでこの変数の値を確認してください。

query_cache_size の値がゼロではない場合は、ストラクチャのアロケートにおよそ 40 KB を必要とするため、クエリ キャッシュのサイズを最低 40 KB でセットしてください。正確なサイズは、システムのアーキテクチャによります。サイズが小さすぎると、警告がでます。

mysql> SET GLOBAL query_cache_size = 40000;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1282
Message: Query cache failed to set size 39936; »
         new query cache size is 0

mysql> SET GLOBAL query_cache_size = 41984;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_size | 41984 |
+------------------+-------+

クエリ キャッシュでクエリ結果を維持するには、サイズを大きく設定してください。

mysql> SET GLOBAL query_cache_size = 1000000;
Query OK, 0 rows affected (0.04 sec)

mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| query_cache_size | 999424 | 
+------------------+--------+
1 row in set (0.00 sec)

query_cache_size は、1024 バイトに近い値のブロックで位置合わせしています。そのため、報告の値は、設定したものとは異なる可能性があります。

クエリ キャッシュのサイズが 0 より大きい場合、query_cache_type 変数がその機能に影響します。この変数は次のような値に設定できます。

  • 0 または OFF という値で、キャッシュを行わない、または キャッシュした結果の読み出しを行わない、という効果になります。

  • 1 または ON という値で、SELECT SQL_NO_CACHE で始まるステートメント以外のキャッシュになります。

  • 2 または DEMAND という値で、SELECT SQL_CACHE で始まるステートメントだけのキャッシュになります。

GLOBAL query_cache_type の値を設定すると、変更後に接続するクライアントに対するクエリ キャッシュの動作を指定できます。SESSION query_cache_type の値を設定すると、それぞれのクライアントで接続時のキャッシュ動作を制御できます。たとえば、クライアントは自分のクエリに対するクエリ キャッシュの使用を無効化します。そのクエリは次のようなものです。

mysql> SET SESSION query_cache_type = OFF;

キャッシュしたそれぞれのクエリ結果の最大サイズの制御は、query_cache_limit 変数で行います。デフォルトは 1 MB です。

クエリをキャッシュする設定である場合、その結果 (クライアントに送信したデータ) を、結果の読み出し中に、クエリ キャッシュに格納します。そのため、データの扱いは、ひとまとめではありません。つまり、クエリ キャッシュで、データをブロックに分割するため、1 つのブロックが埋まれば、次のブロックを埋めることになります。これは、メモリの割り当てに時間がかかるため、クエリ キャッシュではブロックにします。そのときのブロックのサイズを決定するのが、query_cache_min_res_unit 変数です。そして、クエリ実行毎に、ブロックはサイズでトリムすることになるので、メモリを節約できます。サーバで実行するクエリの種類によっては、 query_cache_min_res_unit の値を調整すると効果が高まります。

  • query_cache_min_res_unit のデフォルト値は、4 KB です。大抵の場合、これで十分です。

  • 結果が小さいクエリが多い場合は、フリーのブロックが多く存在することになり、デフォルトのブロック サイズはメモリのフラグメントになります。フラグメントは、メモリ不足を解消するために、キャッシュからクエリを取り除く (削除) 動作を強制的に行います。そのため、query_cache_min_res_unit の値を減らす必要が出てきます。フリー ブロックの数は Qcache_free_blocks を、そして、この動作で強制的に削除の対象になったクエリは Qcache_lowmem_prunes を、それぞれのステータス変数で確認してください。

  • クエリの大部分が大きな結果である場合は、query_cache_min_res_unit で値を増やして、パフォーマンスを改善できます。(Qcache_total_blocks および Qcache_queries_in_cache で、ステータス変数を確認してください。) しかし、値を増やすと、前述のようにメモリ不足の状態になるので、注意が必要です。

MySQL Enterprise.  クエリ キャッシュをうまく活用できないと、パフォーマンスに支障がでます。MySQL Network Monitoring and Advisory Service では、対応策などを提供しています。詳細は http://www-jp.mysql.com/products/enterprise/advisors.html を参照してください。

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates