have_query_cache
サーバーシステム変数は、クエリーキャッシュが使用できるかどうかを示します。
mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
標準 MySQL バイナリを使用している場合、クエリーキャッシュが無効にされている場合でも、この値は常に YES
です。
ほかのいくつかのシステム変数は、クエリーキャッシュ操作を制御します。これらは、mysqld の起動時に、オプションファイルやコマンド行で設定できます。クエリーキャッシュシステム変数はすべて、query_cache_
で始まる名前を持ちます。それらについては、ここで提供している追加の構成情報とともに、セクション5.1.4「サーバーシステム変数」で簡単に説明しています。
クエリーキャッシュのサイズを設定するには、query_cache_size
システム変数を設定します。それを 0 に設定すると、query_cache_type=0
を設定するのと同様に、クエリーキャッシュが無効になります。デフォルトでは、クエリーキャッシュは無効化されます。これは 1M のデフォルトのサイズと、0 の query_cache_type
のデフォルトを使用して実現されます。(MySQL 5.6.8 より前では、1 のデフォルトの query_cache_type
で、デフォルトのサイズは 0 です。)
オーバーヘッドを大幅に削減するには、クエリーキャッシュを使用しない場合に query_cache_type=0
でサーバーも起動します。
Windows Configuration Wizard を使用して、MySQL をインストールまたは構成する場合、query_cache_size
のデフォルト値が、使用可能なさまざまな構成の種類に基づいて、自動的に構成されます。Windows Configuration Wizard を使用する場合、選択した構成のため、クエリーキャッシュが有効になる (つまり、ゼロではない値に設定される) ことがあります。クエリーキャッシュは、query_cache_type
変数の設定によっても制御されます。構成が行われたあとに、my.ini
ファイルに設定されたこれらの変数の値をチェックしてください。
query_cache_size
をゼロ以外の値に設定する場合は、その構造を割り当てるために、クエリーキャッシュに約 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
で始まるステートメントのみをキャッシュさせます。
query_cache_size
が 0 の場合、query_cache_type
変数も 0 に設定してください。この場合、サーバーはクエリーキャッシュ相互排他ロックをまったく獲得しません。これは、実行時にクエリーキャッシュを有効にできず、クエリー実行のオーバーヘッドが削減されることを意味します。
GLOBAL
query_cache_type
値を設定すると、変更が行われたあとに接続するすべてのクライアントのクエリーキャッシュの動作が決定されます。SESSION
query_cache_type
値を設定して、個々のクライアントでそれぞれ独自の接続のキャッシュ動作を制御できます。たとえば、クライアントは次のように独自のクエリーへのクエリーキャッシュの使用を無効にできます。
mysql> SET SESSION query_cache_type = OFF;
サーバーの起動時 (SET
ステートメントによる実行時ではなく) に query_cache_type
を設定する場合、数値のみが許可されます。
キャッシュ可能な個々のクエリー結果の最大サイズを制御するには、query_cache_limit
システム変数を設定します。デフォルト値は 1M バイトです。
キャッシュを大きすぎるサイズに設定しないでください。更新時にキャッシュをロックするスレッドの必要性のため、きわめて大きいキャッシュではロックの競合問題が見られることがあります。
コマンド行または構成ファイルに --maximum-query_cache_size=
オプションを使用して、32M
SET
ステートメントで実行時にクエリーキャッシュに指定できる最大サイズを設定できます。
クエリーがキャッシュされるようにすると、その結果 (クライアントに送信されたデータ) が結果の取得時に、クエリーキャッシュに格納されます。そのため、データは通常 1 つの大きなまとまりで処理されません。クエリーキャッシュはオンデマンドでこのデータを格納するためのブロックを割り当てるため、1 つのブロックがいっぱいになると、新しいブロックが割り当てられます。メモリーの割り当て操作はコスト (時間的) がかかるため、クエリーキャッシュは query_cache_min_res_unit
システム変数によって指定された最小サイズでブロックを割り当てます。クエリーが実行されると、未使用のメモリーが解放されるように、最後の結果ブロックが実際のデータサイズにトリミングされます。サーバーで実行するクエリーの種類によっては、query_cache_min_res_unit
の値をチューニングすることが有効であるとわかる場合があります。
query_cache_min_res_unit
のデフォルト値は 4K バイトです。ほとんどの場合、これで十分であるはずです。小さい結果の大量のクエリーがある場合、多数の空きブロックに示されるように、デフォルトのブロックサイズはメモリーの断片化につながることがあります。断片化は、メモリー不足のために、クエリーキャッシュにキャッシュからクエリーを強制的にプルーニング (削除) させる可能性があります。この場合、
query_cache_min_res_unit
の値を減らします。空きブロックと、プルーニングによって削除されたクエリーの数はQcache_free_blocks
およびQcache_lowmem_prunes
ステータス変数の値によって得られます。ほとんどのクエリーの結果が大きい (
Qcache_total_blocks
およびQcache_queries_in_cache
ステータス変数をチェックします) 場合、query_cache_min_res_unit
を増やして、パフォーマンスを向上できます。ただし、大きくしすぎないようにしてください (前の項目を参照してください)。