我正在研究如何调整 VPS 上 mysql 的查询缓存 [360MB 设置]。当我开始时,它被设置为 32MB,并且我得到了大量的 qcache_lowmem_prunes。我添加了一个 cronjob 来定期运行 FLUSH QUERY CACHE,这有帮助,但还不够。我一直在逐渐扩大它,但即使在 80MB [我暂时从 php-cgi 中拿走了一些内存],我仍然看到 lowmem prunes。
另一方面,我的命中率只有大约 50% [即 Qcache_hits 大约是 Qcache_hits+Com_select 的一半]。我强烈怀疑我的许多查询都是一次性查询,因此不应缓存。我想识别它们,并用 SQL_NO_CACHE 标记它们。
有没有什么简单的方法可以做到这一点?
也可能我的一些查询没有被缓存,因为表已经更改了,尽管基于粗略的思维模型,我不认为这是事实。至少,对于大多数查询,结果应该是一致的;我使用的是 InnoDB,所以我的理解是随机 UPDATE 不一定会使所有 SELECT 无效。这是正确的吗?
答案1
我不明白你为什么要刷新缓存。它会自行处理,并且定期刷新缓存不会带来任何性能优势(据我所知)。50% 的缓存命中率实际上非常惊人。
对表中任何行的任何更新都会使使用该表的所有查询无效。这意味着任何连接到该表的查询都将被清除。结果是否受到影响并不重要。
我建议使用像 memcached 这样的缓存解决方案,这样您可以更细粒度地控制缓存的内容以及数据如何过期。
如果您发现性能问题,最好删除与查询缓存相关的内存,并增加 innodb_buffer_pool 和 innodb_additional_mem_pool_size。
http://dev.mysql.com/doc/refman/5.0/en/innodb-configuration.html
另外,你应该看看 mysql tuner:https://launchpad.net/mysqltuner/
答案2
您可以创建 MySQL 触发器来动态分析传入的请求并使用 query_cache 变量重写它。
这会消耗更多的CPU,但避免查看软件的来源。