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 を参照してください。