调整mysql的查询缓存

调整mysql的查询缓存

我正在研究如何调整 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,但避免查看软件的来源。

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

相关内容