服务器系统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。
注意不要将缓存的大小设置得太大。由于需要线程在更新期间锁定缓存,您可能会看到非常大的缓存出现锁争用问题。
SET
您可以通过使用
命令行或配置文件中的选项
来
设置运行时可为查询缓存指定的最大大小
。--maximum-query_cache_size=
32M
当查询要被缓存时,其结果(发送给客户端的数据)在结果检索期间存储在查询缓存中。因此,数据通常不会以一大块的形式处理。查询缓存根据需要分配块来存储此数据,因此当一个块被填满时,将分配一个新块。因为内存分配操作是昂贵的(时间方面),所以查询缓存分配
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
. 但是,请注意不要使其太大(请参阅上一项)。