早在 2014 年 6 月我就回答过https://dba.stackexchange.com/questions/66774/why-query-cache-type-is-disabled-by-default-start-from-mysql-5-6/66796#66796 https://dba.stackexchange.com/questions/66774/why-query-cache-type-is-disabled-by-default-start-from-mysql-5-6/66796#66796
在那篇文章中,我讨论了 InnoDB 如何微观管理 InnoDB 缓冲池和查询缓存之间的变化。
不使用查询缓存
最简单的答案是禁用查询缓存,但有一个问题:您必须同时设置查询缓存大小 http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_query_cache_size and 查询缓存类型 http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_query_cache_type为零(0)。
如果你不设置查询缓存类型 http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_query_cache_type到零(0),变更的微观管理仍然发生。这是通过以下内容验证的MySQL 文档“查询缓存配置”第 8 段 http://dev.mysql.com/doc/refman/5.6/en/query-cache-configuration.html says
如果query_cache_size为0,则还应该将query_cache_type变量设置为0。在这种情况下,服务器根本不获取查询缓存互斥体,这意味着查询缓存无法在运行时启用,从而减少查询执行的开销。
使用查询缓存
如果您确实希望使用查询缓存,那么您需要研究您的数据。基本上,您需要知道结果的大小。然后你会设置查询缓存限制 http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_query_cache_limit and query_cache_min_res_unit http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_query_cache_min_res_unit以容纳平均大小的结果集以及最大大小的结果集。
作为替代方案,您可以全局启用查询缓存,但从数据库会话中禁用它的使用,如中所述第 9 段 http://dev.mysql.com/doc/refman/5.6/en/query-cache-configuration.html:
设置 GLOBAL query_cache_type 值可确定更改后连接的所有客户端的查询缓存行为。各个客户端可以通过设置 SESSION query_cache_type 值来控制自己连接的缓存行为。例如,客户端可以禁用其自己的查询的查询缓存,如下所示:
mysql> SET SESSION query_cache_type = OFF;
您的实际问题
查询缓存、InnoDB 缓冲池、每个连接线程(请参阅我的帖子https://dba.stackexchange.com/questions/16969/how-costly-is-opening-and-fitting-of-a-db-connection/16973#16973 https://dba.stackexchange.com/questions/16969/how-costly-is-opening-and-closing-of-a-db-connection/16973#16973),操作系统都争夺 RAM。
当仅查看查询缓存和 InnoDB 缓冲池时,您需要查看 MySQL 运行数天或数周后 InnoDB 缓冲池中有多少可用空间。
您可以运行这个查询
SELECT variable_value / 64 free_mb
FROM information_schema.global_status
WHERE variable_name='Innodb_buffer_pool_pages_free';
这将告诉您可以将 InnoDB 缓冲池降低多少。然后,您可以将查询缓存增加该大小。如果此查询返回的值小于 1024,则可能不值得付出努力。您要么从 RAM 中获得额外的空间,要么只是禁用查询缓存。