我正在研究在我的 VPS [360MB 设置] 上调整 mysql 上的查询缓存。当我开始时,它被设置为 32MB,并且我得到了不平凡的 qcache_lowmem_prunes。我添加了一个 cronjob 来定期运行 FLUSH QUERY CACHE,这有帮助,但还不够。我一直在逐渐扩大它,但即使是 80MB [我暂时从 php-cgi 中取出了一些内存],我仍然看到 lowmem prunes。
OTOH,我只有大约 50% 的命中率[即,Qcache_hits 大约是 Qcache_hits+Com_select 的一半]。我强烈怀疑我的许多查询都是一次性查询,因此不应该被缓存。我想识别它们,并用 SQL_NO_CACHE 标记它们。
有什么简单的方法可以做到这一点吗?
由于表已更改,我的某些查询也可能未缓存,尽管基于粗略的心理模型,我认为情况并非如此。至少,大多数查询的结果应该是一致的;我正在使用 InnoDB,所以我的理解是随机 UPDATE 不一定会使所有 SELECT 无效。这个对吗?
我不明白你为什么要刷新缓存。它会自行处理,并且定期刷新它没有性能优势(我已经看到)。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/
您可以创建 MySQL 触发器来动态分析传入请求并使用 query_cache var 重写它。
这会消耗更多的CPU,但避免看软件的来源。
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html