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变量会影响其工作方式。可以将此变量设置为以下值:
-
值
0
或OFF
防止缓存或检索缓存的结果。 -
值
1
或ON
启用缓存,但以SELECT SQL_NO_CACHE
开头的语句除外。 -
值
2
或DEMAND
导致仅缓存以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的值会有所帮助:
-
query_cache_min_res_unit的默认值为 4KB。对于大多数情况,这应该足够了。
-
如果您有很多查询但结果很少,则默认的块大小可能会导致内存碎片,这由大量的空闲块指示。由于内存不足,碎片可能会迫使查询缓存从缓存中删除(删除)查询。在这种情况下,减小query_cache_min_res_unit的值。由于修剪而删除的可用块和查询的数量由状态变量Qcache_free_blocks和Qcache_lowmem_prunes的值给出。
-
如果您的大多数查询都有较大的结果(请检查Qcache_total_blocks和Qcache_queries_in_cache状态变量),则可以通过提高query_cache_min_res_unit来提高性能。但是,请注意不要使其过大(请参阅上一项)。