have_query_cache
というサーバーのシステム変数は、クエリキャッシュの利用可能にします。
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
MySQL
標準バイナリを使用しているときは、この値は常に、YES
です。クエリキャッシュを無効化している場合も同様です。
システム変数によっては、クエリキャッシュのオペレーション制御を行います。mysqld
起動時に、オプションファイルやコマンドラインで指定できます。クエリキャッシュのシステム変数名はすべて、query_cache_
という文字で始まります。これに関する簡単な説明を
Server System Variables
で参照してください。この節では、設定に関する情報を提供します。
クエリキャッシュのサイズを設定するには、query_cache_size
システム変数を使用します。値を 0
にすると、クエリキャッシュは無効化します。デフォルトは
0 で設定しています。
Windows Configuration Wizard を使用して、MySQL
をインストールまたは設定するときは、利用可能なコンフィギュレーションの種類に合わせて、自動的に
query_cache_size
の値をデフォルト設定します。Windows
Configuration Wizard
を使用するときは、場合によって、クエリーキャッシュが有効になります。つまり、ゼロではない値になることがあります。クエリキャッシュの制御は、query_cache_type
変数で行います。コンフィギュレーションを始めるときには、my.ini
ファイルでこの変数の値を確認してください。
query_cache_size
の値がゼロではない場合は、構造の割り当てにおよそ
40KB
を必要とするため、クエリーキャッシュのサイズを最低
40KB
で設定してください。正確なサイズは、システムのアーキテクチャーによります。サイズが小さすぎると、警告がでます。
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_type
を (実行時に
SET
ステートメントで設定するのではなく)
サーバーの起動時に設定した場合は、数値のみ使用できます。
キャッシュしたそれぞれのクエリー結果の最大サイズの制御は、query_cache_limit
変数で行います。デフォルトの値は 1MB です。
実行時に
SET
ステートメントで指定できるクエリーキャッシュの最大サイズを、コマンドラインまたは設定ファイルで
--maximum-query_cache_size=
オプションを使用して設定できます。
32M
クエリーをキャッシュする設定である場合、その結果
(クライアントに送信したデータ)
を、結果の読み出し中に、クエリキャッシュに格納します。そのため、データの扱いは、ひとまとめではありません。つまり、クエリキャッシュで、データをブロックに分割するため、1
つのブロックが埋まれば、次のブロックを埋めることになります。これは、メモリーの割り当てに時間がかかるため、クエリキャッシュではブロックにします。そのときのブロックのサイズを決定するのが、query_cache_min_res_unit
変数です。そして、クエリー実行毎に、ブロックはサイズでトリムすることになるので、メモリーを節約できます。サーバーで実行するクエリーの種類によっては、query_cache_min_res_unit
の値を調整すると効果が高まります。
query_cache_min_res_unit
のデフォルト値は、4KB
です。大抵の場合、これで十分です。
結果が小さいクエリーが多い場合は、フリーのブロックが多く存在することになり、デフォルトのブロックサイズはメモリーの断片化になります。断片化は、メモリー不足を解消するために、キャッシュからクエリーを取り除く
(削除)
動作を強制的に行います。そのため、query_cache_min_res_unit
の値を減らす必要が出てきます。フリーブロックの数は
Qcache_free_blocks
を、そして、この動作で強制的に削除の対象になったクエリーは
Qcache_lowmem_prunes
を、それぞれのステータス変数で確認してください。
クエリーの大部分が大きな結果である場合は、query_cache_min_res_unit
で値を増やして、パフォーマンスを改善できます
(Qcache_total_blocks
および
Qcache_queries_in_cache
で、ステータス変数を確認してください)。しかし、値を増やすと、前述のようにメモリー不足の状態になるので、注意が必要です。