原文:https://dev.MySQL.com/doc/refman/5.5/en/query-cache-configuration.html
系统变量have_query_cache 标识缓存是否可用:
mysql> SHOW VARIABLES LIKE 'have_query_cache';+------------------+-------+| Variable_name | Value |+------------------+-------+| have_query_cache | YES |+------------------+-------+当使用时标准版MySQL时,该值总是YES,不论查询缓存是否已经关闭。
还有一些系统变量控制缓存的操作行为。这些变量可以通过配置文件或者mysqld启动命令行修改。与缓存相关的系统变量命名都是以“query_cache_”开头的。在 Section 5.1.5, “Server System Variables”对这些变量有详细的说明。
设置query_cache_size变量可以控制缓存的容量(size),设置为0表示关闭缓存。该变量的默认值是0,所以缓存默认时关闭的。
为了减少开销,如果不使用查询缓存,在启动服务时将query_cache_type=0 。
注意 当使用窗口配置引导安装或配置MySQL时,query_cache_size的默认值是按照选择的配置类型自动调整的。当使用窗口配置向导,由于选择的配置不同,查询缓存可能是开启的(也就是说,设置了非0值)。查询缓存仍然可以通过query_cache_type变量控制。当配置完成后可以在my.ini文件中查看query_cache_type的具体值。
当你设置了query_cache_size为非0值,查询缓存至少需要分配约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: 1282Message: Query cache failed to set size 39936; new query cache size is 0mysql> 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 byte的倍数。这个值可能和你实际分配的不同。
如果query_cache_size的值大于0,query_cache_type将控制缓存时如何工作的。query_cache_type的取值如下:
0或OFF:不缓存数据或不从缓存中取数据。1或ON:使用缓存,但使用了SELECT SQL_NO_CACHE语法将不使用缓存。2或DEMAND:只有使用了SELECT SQL_CACH语法的sql使用缓存如果query_cache_size是0,最好将query_cache_type也设置为0.系统将不在验证是否使用缓存,也就是说查询缓存不可用并且在运行时减少执行查询语句的开销。
修改了全局变量query_cache_type的值后,将影响所有客户端连接使用缓存的方式。客户端可以在session上设置query_cache_type值,以达到定制化的缓存使用方式。例如,客户端可以对自己发出查询语句关闭缓存:
mysql> SET SESSION query_cache_type = OFF;如果你是在系统启动时(不是运行时通过set语句)设置 query_cache_type的值,则只能设置数字。
为了控制每个查询结果可以缓存的最大值,需要设置系统变量query_cache_limit,其默认值是1M。
千万不要将缓存的容量设置的太大。由于线程在更新缓存时会对缓存加锁,你会看到锁在竞争非常多的缓存资源。
注意 你可以通过命令行SET语句加上 –maximum-query_cache_size=32M 选项或配置文件,在server运行时动态修改缓存的最大容量。
当以查询被缓存以后,查询结果(返回给客户端的数据)被缓存并在后续的查询中使用。 因为数据通常不会存在同一个内存块内。查询缓存会按需分配内存块,当一块内存填入数据后,再分配一个新的内存块。因为内存分配操作(在时间上)代价是非常大的,系统变量 query_cache_min_res_unit 设置了查询缓存分配的内存块的最小值。当一个查询语句执行后,前一个使用的缓存数据的代码块将会压缩至实际使用的数据大小,未使用的空间将会释放。由于查询语句的类型(使用情况和返回数据量)不同,你可能需要调整 query_cache_min_res_unit参数来更有效的使用缓存:
query_cache_min_res_unit 默认值时4KB,该值能满足绝大多数情况。如果你有大量的查询返回的结果比较小,默认的块大小可能会导致很多内存碎片。内存碎片会导致查询缓存由于内存不足而被强制清除。在这种情况下,需要减少query_cache_min_res_unit的值。什么情况下释放内存块,释放多少内存块分别由Qcache_lowmem_PRunes和Qcache_free_blocks这两个变量控制。如果很多查询返回的数据量很大(根据Qcache_total_blocks and Qcache_queries_in_cache值判断),你可以增加query_cache_min_res_unit值。无论如何,不要将这个值设置的太大(看前面的面说明)新闻热点
疑难解答