8.10.3.4 查询缓存状态和维护

Note

从 MySQL 5.7.20 开始,查询缓存已弃用,并在 MySQL 8.0 中删除。

要检查您的 MySQL 服务器中是否存在查询缓存,请使用以下语句:

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

您可以对查询缓存进行碎片整理,以通过冲洗查询缓存语句更好地利用其内存。该语句不会从缓存中删除任何查询。

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_blocksQcache_free_blocks可能指示查询缓存内存碎片。在冲洗查询缓存之后,仅剩余一个空闲块。

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

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