【发布时间】:2011-01-06 22:13:59
【问题描述】:
我的应用程序是数据库密集型应用程序,因此我非常努力地确保应用程序和 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。
【问题讨论】:
-
query_cache_size应该在 100 到 200 MB 左右。如果可以的话,使用一个小的query_cache_limit,从而在内存中存储尽可能多的小查询结果(== 使用查询缓存时不要使用 1MB 的默认值)。
标签: caching mysql performance innodb