查询缓存从 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
如果您不打算使用查询缓存,请启动服务器。
当使用 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
orON
启用缓存,但以 开头的那些语句除外SELECT SQL_NO_CACHE
。2
or 的值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.
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=
option on the command line or in the configuration file.
32M
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 theQcache_free_blocks
andQcache_lowmem_prunes
status variables.如果您的大多数查询都有很大的结果(检查
Qcache_total_blocks
和Qcache_queries_in_cache
状态变量),您可以通过增加query_cache_min_res_unit
. 但是,请注意不要使其太大(请参阅上一项)。