我的应用程序是非常数据库密集型的,所以我已经非常努力地确保应用程序和MySQL数据库尽可能有效地一起工作。
目前,我正在调优MySQL查询缓存,使其符合服务器上运行的查询的特征。query_cache_size
是可以存储在缓存中的最大数据量,query_cache_limit
是缓存中单个结果集的最大大小。
我当前的MySQL查询缓存配置如下:
query_cache_size=128M
query_cache_limit=1M
tuning-primer.sh
给出了以下关于运行系统的调优提示:
QUERY CACHE
Query cache is enabled
Current query_cache_size = 128 M
Current query_cache_used = 127 M
Current query_cache_limit = 1 M
Current Query cache Memory fill ratio = 99.95 %
Current query_cache_min_res_unit = 4 K
However, 21278 queries have been removed from the query cache due to lack of memory
Perhaps you should raise query_cache_size
MySQL won't cache query results that are larger than query_cache_limit in size
mysqltuner.pl
给出了以下调优提示:
[OK] Query cache efficiency: 31.3% (39K cached / 125K selects)
[!!] Query cache prunes per day: 2300654
Variables to adjust:
query_cache_size (> 128M)
这两个调优脚本都建议我提升query_cache_size
。但是,根据mysqltuner.pl
,将query_cache size
增加到128M以上可能会降低性能(请参见http://mysqltuner.pl/)。
你将如何解决这个问题?您是否会不顾mysqltuner.pl
的警告而增加query_cache_size,或者尝试以某种方式调整查询逻辑?大多数数据访问由Hibernate处理,但应用程序中也使用了大量手工编码的SQL。
6条答案
按热度按时间uttx8gqw1#
即使mysqltuner.py您的缓存没有被交换的风险,www.example.com发出的警告也是相关的。这在下面得到了很好的解释:http://blogs.oracle.com/dlutz/entry/mysql_query_cache_sizing
基本上,MySQL花费更多的时间来整理该高速缓存缓存越大,由于缓存即使在中等的写入负载下也非常不稳定(查询经常被清除),因此将其放置得太大会对应用程序性能产生不利影响。为你的应用程序调整
query_cache_size
和query_cache_limit
,试着找到一个断点,在那里你有最多的每次插入命中,一个低数量的lowmem_prunes
,并密切关注你的数据库服务器负载,同时这样做。vx6bjr1n2#
通常“缓存大小太大”的警告是在假设您只有很少的物理内存并且该高速缓存本身需要交换或将占用
OS
所需的资源(如文件缓存)的情况下发出的。如果您有足够的内存,增加
query_cache size
是安全的(我见过使用1GB
查询缓存的安装)。但是你确定你使用的查询缓存是正确的吗?是否有很多 * 逐字重复 * 的查询?你能提供一个典型查询的例子吗?
7rfyedvj3#
你应该很容易增加你的缓存,这不仅仅是一个“没有那么多可用的内存”的事情!
例如,阅读the manual,您会得到以下引用:
请注意不要将查询缓存设置得过大,因为这会增加该高速缓存所需的开销,而且可能会超出启用缓存的好处。几十兆字节的大小通常是有益的。数百兆字节的大小可能不会。
有various其他sources你可以检查出来!
非零修剪率可能表明您应该增加查询缓存的大小。但是,请记住,该高速缓存的开销可能会随着其大小的增加而增加,因此请以较小的增量执行此操作并监视结果。如果需要显著增加该高速缓存的大小以消除修剪,则很有可能您的工作负载与查询缓存不匹配。
因此,不要只是把尽可能多的东西放在查询缓存中!
最好的办法是逐步增加查询缓存并测量站点的性能。这是性能问题中的某种默认设置,但在这种情况下,“测试”是你能做的最好的事情之一。
wyyhbhjk4#
注意query_cache_size和limit设置过高。MySQL只使用一个线程来读取查询缓存。
将query_cache_size设置为4G,query_cache_limit设置为12M,我们的查询缓存率为85%,但注意到连接中经常出现峰值。
将query_cache_size改为256M,query_cache_limit改为64K后,查询缓存率下降到50%,但整体性能有所提升。
eni9jsuy5#
查询缓存的开销大约是10%,所以我会禁用查询缓存。通常,如果你不能让你的命中率超过40或50%,也许查询缓存不适合你的数据库。
我写了关于这个主题的博客……Mysql query_cache_size performance here。
ct2axkht6#
每次插入时,查询缓存都会失效/刷新,使用InnoDB/cache并避免查询缓存或将其设置为非常小的值。