我应该牺牲我的innodb_buufer_pool _size / RAM来为query_cache_size腾出空间吗?

时间:2016-02-19 06:27:59

标签: mysql performance innodb query-performance query-cache

我有一个16GB的专用Mysql服务器数据库。我的innodb_buffer_pool_size设置为11GB左右,我在我的系统中实现了查询缓存,其大小为80mb。我应该从哪里创建这个空间,innodb_buffer_pool_size或RAM?

2 个答案:

答案 0 :(得分:2)

早在2014年6月,我回答了https://dba.stackexchange.com/questions/66774/why-query-cache-type-is-disabled-by-default-start-from-mysql-5-6/66796#66796

在那篇文章中,我讨论了InnoDB微管理如何在InnoDB缓冲池和查询缓存之间发生变化。

不使用QUERY CACHE

最简单的答案是禁用查询缓存,但有一个问题:您必须将query_cache_sizequery_cache_type都设置为零(0)。

如果未将query_cache_type设置为零(0),则仍会发生更改的微观管理。这可以通过Paragraph 8 of the MySQL Documentation "Query Cache Configuration"所说的

来验证
  

如果query_cache_size为0,则还应将query_cache_type变量设置为0.在这种情况下,服务器根本不会获取查询缓存互斥锁,这意味着无法在运行时启用查询缓存,并且减少了开销。查询执行。

使用QUERY CACHE

如果您确实希望使用查询缓存,则需要研究数据。基本上,您需要知道结果的大小。然后,您可以设置query_cache_limitquery_cache_min_res_unit以适应平均大小结果集以及最大大小结果集。

作为替代方案,您可以全局启用查询缓存,但可以按照Paragraph 9中的说明从数据库会话中禁用它:

  

设置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-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获得额外的空间,或者只是禁用查询缓存。

答案 1 :(得分:1)

NO 。查询缓存可能在80MB之后耗尽 - 它花费更多时间修剪条目。

我建议超过90%的生产系统完全(或应该)完全关闭质量控制。

请记住,每次写一个表都会清除该表的QC中的所有条目。

16GB专用服务器上的11G是innodb_buffer_pool_size的一个很好的数字。

相关问题