8.10.3.3 查询缓存配置

Note

从 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_type的默认值 0 来实现的。

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

Note

使用 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防止缓存或检索缓存的结果。

  • 1ON启用缓存,但以SELECT SQL_NO_CACHE开头的语句除外。

  • 2DEMAND导致仅缓存以SELECT SQL_CACHE开头的那些语句。

如果query_cache_size为 0,则还应将query_cache_type变量设置为 0.在这种情况下,服务器根本不获取查询缓存互斥量,这意味着无法在运行时启用查询缓存,并且减少了查询执行的开销。

设置GLOBAL query_cache_type值可以确定更改后连接的所有 Client 端的查询缓存行为。各个 Client 端可以通过设置SESSION query_cache_type值来控制其自己的连接的缓存行为。例如,Client 端可以禁止对自己的查询使用查询缓存,如下所示:

mysql> SET SESSION query_cache_type = OFF;

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

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

注意不要将缓存的大小设置得太大。由于在更新过程中需要线程锁定高速缓存,因此您可能会看到高速缓存非常大的锁定争用问题。

Note

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

当要缓存查询时,其结果(发送到 Client 端的数据)将在结果检索期间存储在查询缓存中。因此,通常不会大批量处理数据。查询高速缓存分配块以按需存储此数据,因此当一个块被填充时,将分配一个新块。由于内存分配操作成本高昂(按时间排列),因此查询高速缓存将分配具有query_cache_min_res_unit系统变量给定的最小大小的块。执行查询时,将最后一个结果块修剪为实际数据大小,以便释放未使用的内存。根据服务器执行的查询类型,您可能会发现调整query_cache_min_res_unit的值会有所帮助: