Documentation Home

8.10.3.3 查询缓存配置

服务器系统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。

注意不要将缓存的大小设置得太大。由于需要线程在更新期间锁定缓存,您可能会看到非常大的缓存出现锁争用问题。

笔记

SET 您可以通过使用 命令行或配置文件中的选项 来 设置运行时可为查询缓存指定的最大大小 。--maximum-query_cache_size=32M

当查询要被缓存时,其结果(发送给客户端的数据)在结果检索期间存储在查询缓存中。因此,数据通常不会以一大块的形式处理。查询缓存根据需要分配块来存储此数据,因此当一个块被填满时,将分配一个新块。因为内存分配操作是昂贵的(时间方面),所以查询缓存分配 query_cache_min_res_unit 系统变量给定的最小大小的块。执行查询时,最后一个结果块将被修剪为实际数据大小,以便释放未使用的内存。根据您的服务器执行的查询类型,您可能会发现调整 的值很有帮助 query_cache_min_res_unit