【问题标题】:MySQL query caching: limited to a maximum cache size of 128 MB?MySQL 查询缓存:最大缓存大小限制为 128 MB?
【发布时间】: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


【解决方案1】:

mysqltuner.py 发出的警告实际上是相关的,即使您的缓存没有被交换的风险。 以下内容对此进行了很好的解释: http://blogs.oracle.com/dlutz/entry/mysql_query_cache_sizing

基本上,如果缓存越大,MySQL 就会花费更多时间来整理缓存,而且由于即使在中等写入负载下缓存也非常不稳定(查询经常被清除),所以将其设置得太大会对您的应用程序性能产生不利影响。为您的应用程序调整 query_cache_sizequery_cache_limit,尝试找到一个断点,您每次插入的点击次数最多,lowmem_prunes 的数量较少,并在这样做的同时密切关注您的数据库服务器负载。

【讨论】:

    【解决方案2】:

    通常会发出“缓存太大”警告,假设您的物理内存很少,并且缓存本身需要交换或占用OS 所需的资源(如文件缓存)。

    如果你有足够的内存,增加query_cache size 是安全的(我见过使用1GB 查询缓存的安装)。

    但是你确定你使用的是查询缓存吗?是否有很多 逐字重复 查询?能否请您发布一个典型查询的示例?

    【讨论】:

    • “查询缓存效率”约为 30 %,所以我假设大约该百分比的查询是“逐字重复查询”。还是我错过了什么? :-)
    • 如果您重复1 查询30,000 次或重复30,000 查询1 次,这将为您提供相同数量的缓存命中,但所需的缓存大小不同。
    • 有很多提及(甚至是手册本身),您不希望它变得太高。我遇到了这个旧的答案,所以是一个公平的警告。如果我能解决它,我也会添加我自己的答案
    • 好吧,我添加了自己的答案,因为我认为这是不正确的。根据手册,如果“几百”可能太大,我认为您不想使用 1gb 缓存大小:) ...我添加了我的评论作为警告,这可能不正确(不再正确了吗?)
    • @Nanne:所以您尝试了 1GB 缓存并遇到了麻烦?
    【解决方案3】:

    应该轻松增加缓存,这不仅是“没有那么多可用内存”的事情!

    例如阅读the manual 你会得到这个报价:

    请谨慎设置查询缓存的大小过大,这会增加维护缓存所需的开销,可能超出启用它的好处。数十兆字节的大小通常是有益的。数百兆字节的大小可能不会。

    还有various其他sources可以去看看!

    非零修剪率可能表明您应该增加查询缓存的大小。但是,请记住,维护缓存的开销可能会随着缓存的大小而增加,因此请以较小的增量执行此操作并监控结果。如果您需要大幅增加缓存的大小以消除修剪,那么您的工作负载很可能与查询缓存不匹配。

    所以不要在查询缓存中尽可能多地放!

    最好的办法是逐渐增加查询缓存并衡量您网站的性能。这是性能问题中的某种默认设置,但在这种情况下,“测试”是您可以做的最好的事情之一。

    【讨论】:

      【解决方案4】:

      小心设置 query_cache_size 并将限制设置为高。 MySQL 仅使用单个线程从查询缓存中读取。

      query_cache_size 设置为 4G 和 query_cache_limit 12M 时,我们的查询缓存率为 85%,但注意到连接数反复出现峰值。

      query_cache_size 更改为 256M 和 64K query_cache_limit 后,查询缓存率下降到 50%,但整体性能有所提高。

      【讨论】:

        【解决方案5】:

        查询缓存的开销约为 10%,因此我将禁用查询缓存。通常,如果您的命中率不能超过 40 % 或 50 %,则查询缓存可能不适合您的数据库。

        我有关于这个主题的博客...Mysql query_cache_size performance here

        【讨论】:

          【解决方案6】:

          每次插入时查询缓存都会失效/刷新,使用 InnoDB/缓存并避免查询缓存或将其设置为非常小的值。

          【讨论】:

          • 当您说“InnoDB/cache”时,您指的是哪个设置?
          • innodb_buffer_pool_size=90% 可用内存或尽可能高
          • 这可能是一个有效的建议,但没有解释为什么 Innodb 缓存更好/不同,我无法投票
          • 据我了解,innodb 缓冲池缓存是通用缓存(表等),而查询缓存特定于查询,您可能已经猜到了。因此,它们不冲突,也不比另一个更好。两者都需要调整,因为它们具有不同的目的/目标/功能/价值。
          猜你喜欢
          • 2015-12-20
          • 1970-01-01
          • 1970-01-01
          • 2019-07-28
          • 1970-01-01
          • 2012-02-08
          • 2013-04-01
          • 2021-11-17
          • 2011-02-25
          相关资源
          最近更新 更多