Documentation Home

8.10.3.3 查询缓存配置

笔记

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

服务器系统have_query_cache变量指示查询缓存是否可用:

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

使用标准 MySQL 二进制文件时,此值始终为 YES,即使禁用查询缓存也是如此。

其他几个系统变量控制查询缓存操作。这些可以在启动mysqld时在选项文件或命令行上设置。查询缓存系统变量的名称都以 query_cache_. 它们在 第 5.1.7 节“服务器系统变量”中进行了简要描述,并在此处提供了其他配置信息。

要设置查询缓存的大小,请设置 query_cache_size系统变量。将它设置为 0 将禁用查询缓存,设置也是如此query_cache_type=0。默认情况下,查询缓存是禁用的。这是使用默认大小 1M 实现的,默认大小为 query_cache_type0。

为了显着减少开销, query_cache_type=0如果您不打算使用查询缓存,请启动服务器。

笔记

当使用 Windows 配置向导安装或配置 MySQL 时,默认值 query_cache_size是根据可用的不同配置类型自动为您配置的。使用 Windows 配置向导时,由于所选的配置,可能会启用查询缓存(即设置为非零值)。查询缓存也由 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变量会影响其工作方式。该变量可以设置为以下值:

  • 0OFF 阻止缓存或检索缓存结果。

  • 1orON 启用缓存,但以 开头的那些语句除外 SELECT SQL_NO_CACHE

  • 2or 的值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;

如果您query_cache_type 在服务器启动时设置(而不是在运行时使用 SET 语句),则只允许使用数值。

要控制可以缓存的单个查询结果的最大大小,请设置 query_cache_limit系统变量。默认值为 1MB。

Be careful not to set the size of the cache too large. Due to the need for threads to lock the cache during updates, you may see lock contention issues with a very large cache.

Note

You can set the maximum size that can be specified for the query cache at runtime with the SET statement by using the --maximum-query_cache_size=32M option on the command line or in the configuration file.

When a query is to be cached, its result (the data sent to the client) is stored in the query cache during result retrieval. Therefore the data usually is not handled in one big chunk. The query cache allocates blocks for storing this data on demand, so when one block is filled, a new block is allocated. Because memory allocation operation is costly (timewise), the query cache allocates blocks with a minimum size given by the query_cache_min_res_unit system variable. When a query is executed, the last result block is trimmed to the actual data size so that unused memory is freed. Depending on the types of queries your server executes, you might find it helpful to tune the value of query_cache_min_res_unit:

  • The default value of query_cache_min_res_unit is 4KB. This should be adequate for most cases.

  • If you have a lot of queries with small results, the default block size may lead to memory fragmentation, as indicated by a large number of free blocks. Fragmentation can force the query cache to prune (delete) queries from the cache due to lack of memory. In this case, decrease the value of query_cache_min_res_unit. The number of free blocks and queries removed due to pruning are given by the values of the Qcache_free_blocks and Qcache_lowmem_prunes status variables.

  • 如果您的大多数查询都有很大的结果(检查 Qcache_total_blocksQcache_queries_in_cache 状态变量),您可以通过增加 query_cache_min_res_unit. 但是,请注意不要使其太大(请参阅上一项)。