MySQL 5.6 リファレンスマニュアル  /  ...  /  クエリーキャッシュのステータスと保守 クエリーキャッシュのステータスと保守

MySQL サーバーにクエリーキャッシュが存在するかどうかをチェックするには、次のステートメントを使用します。

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

FLUSH QUERY CACHE ステートメントによって、クエリーキャッシュをデフラグして、そのメモリーの利用を改善できます。このステートメントは、キャッシュからクエリーを削除しません。

RESET QUERY CACHE ステートメントは、クエリーキャッシュからすべてのクエリー結果を削除します。FLUSH TABLES ステートメントもこれを実行します。

クエリーキャッシュのパフォーマンスをモニターするには、SHOW STATUS を使用して、キャッシュのステータス変数を表示します。

mysql> SHOW STATUS LIKE 'Qcache%';
| Variable_name           | Value  |
| Qcache_free_blocks      | 36     |
| Qcache_free_memory      | 138488 |
| Qcache_hits             | 79570  |
| Qcache_inserts          | 27087  |
| Qcache_lowmem_prunes    | 3114   |
| Qcache_not_cached       | 22989  |
| Qcache_queries_in_cache | 415    |
| Qcache_total_blocks     | 912    |


SELECT クエリーの合計数は、次の式で得られます。

+ Qcache_hits
+ queries with errors found by parser

Com_select 値は次の式で得られます。

+ Qcache_not_cached
+ queries with errors found during the column-privileges check

クエリーキャッシュでは、可変長ブロックを使用するため、Qcache_total_blocks および Qcache_free_blocks に、クエリーキャッシュのメモリー断片化が示されることがあります。FLUSH QUERY CACHE 後には、空きブロックが 1 つだけ残ります。

キャッシュされるすべてのクエリーには、少なくとも 2 つのブロック (1 つはクエリーテキスト用で、1 つ以上はクエリー結果用) が必要です。さらに、クエリーで使用される各テーブルにも 1 つのブロックが必要です。ただし、複数のクエリーで同じテーブルを使用している場合、1 つのテーブルブロックだけを割り当てる必要があります。

Qcache_lowmem_prunes ステータス変数によって提供される情報は、クエリーキャッシュサイズをチューニングするのに役立つことがあります。それは、新しいクエリーのキャッシュのためにメモリーを解放するために、キャッシュから削除されたクエリーの数をカウントします。クエリーキャッシュは、LRU (Least Recently Used) 戦略を使用して、キャッシュから削除するクエリーを決定します。チューニング情報は、セクション8.9.3.3「クエリーキャッシュの構成」にあります。

Download this Manual
EPUB - 7.5Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb
User Comments
  Posted by Frank Speiser on December 13, 2004
The optimal value of Qcache_lowmem_prunes is 0. You want to make sure you set the query_cache_size high enough to hold your frequently used queries. MySQL trims what is held in the query_cache when it needs space. Having said that, a total of zero Qcache_lowmem_prunes might not be possible, so you should strive to keep it as low as possible. See: query_cache_size and of course query_cache_type (should be set to 1).
  Posted by Vlatko Šurlan on July 5, 2010
But you do not want to have MySQL spend a bunch of time sorting the cache index. Apparently there are some production case reports where too big caches caused MySQL to spend over 70% of it's processing time doing just that - sorting it's cache index. Ideally you want queries worth caching in the cache and the rest ignored. Here is a nice little treaty on a few nasty gotchas and tricks that can shave a few hours off of your 'what the heck is going on here' time:
Sign Up Login You must be logged in to post a comment.