Documentation Home
MySQL 8.0 参考手册  / 第8章优化  / 8.10 缓冲和缓存  / 8.10.3 The MySQL Query Cache  /  8.10.3.4 查询缓存状态和维护

8.10.3.4 查询缓存状态和维护

要检查您的 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    |
+-------------------------+--------+

第 5.1.9 节“服务器状态变量” 中给出了这些变量中的每一个的描述 。此处描述了它们的一些用途。

查询总数SELECT 由以下公式给出:

  Com_select
+ Qcache_hits
+ queries with errors found by parser

Com_select值由以下公式给出:

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

查询缓存使用可变长度块,因此 Qcache_total_blocks可能 Qcache_free_blocks指示查询缓存内存碎片。之后 FLUSH QUERY CACHE,只剩下一个空闲块。

每个缓存查询至少需要两个块(一个用于查询文本,一个或多个用于查询结果)。此外,查询使用的每个表都需要一个块。但是,如果两个或多个查询使用同一张表,则只需要分配一个表块。

状态变量提供的信息 Qcache_lowmem_prunes可以帮助您调整查询缓存大小。它计算已从缓存中删除的查询数,以释放内存来缓存新查询。查询缓存使用最近最少使用 (LRU) 策略来决定从缓存中删除哪些查询。调整信息在 第 8.10.3.3 节,“查询缓存配置”中给出。