2010-05-25 58 views
2

我正在运行一个php/mysql驱动的网站,访问量很大,我正在考虑在共享内存中缓存结果集的可能性,以减少数据库负载。
但是,现在MySQL的查询缓存已启用,它似乎做得非常好,因为如果禁用查询缓存,则CPU的使用将立即跳转到100%。
鉴于这种情况,我不知道在PHP中共享内存中本地缓存结果集(甚至是生成的HTML代码)是否会带来显着的性能提升。MySQL查询缓存vs应用程序层中的缓存结果集

有没有人在这方面有过任何经验? PS:请避免建议像memcached这样的重炮解决方案。现在我正在寻找简单的解决方案,不需要太多时间来实施,部署和维护。

编辑:
我看到我对memcached的评论偏离实际点,这是在应用层的缓存数据库查询是否会导致明显的服务表现影响,考虑到这些查询的结果都已经是答案缓存在数据库级别。

+1

您的数据使用情况如何?大部分读取和写入很少,还是有很多写入活动? – 2010-05-25 17:41:50

+1

CPU使用率达到100%是可疑的。大多数数据库最终都会绑定IO,而不是绑定CPU。 – 2010-05-25 18:05:44

+0

有很多写操作,但我设法安排表格,以便大多数查询表格的修改次数减少。这就是为什么MySQL的查询缓存工作得很好。 – GetFree 2010-05-25 18:07:41

回答

3

我知道你不想听到关于memcached的消息,但它是你想要做的最好的解决方案之一。根据您的网站使用情况,性能可能会有大幅提升。通过简单地在我的数据库会话处理程序上使用memcached的会话处理程序,我可以减少一半的负载,并减少30%以上的请求服务时间。

实际上,memcached是一个简单的解决方案。它已经与PHP集成(如果你已经加载了扩展),它几乎不需要配置(我只需在我的Linux机器上添加memcached作为服务,这是在一个或两个shell命令中完成的)。

我会建议在会话缓存中存储会话数据(以及任何可用于缓存的内容)。对于动态页面(比如堆栈溢出主页),我建议缓存输出几秒钟以防泛滥。

0

体面的单箱解决方案是基于文件的缓存,但您必须手动将其清除。除此之外,你可以使用APC,这是非常快速和内存(仍然必须自己过期)。

但是,只要扩展一台Web服务器,您就需要一个共享缓存,它是memcached。你为什么如此坚持不部署这个?这并不难,它只是为您节省时间。你现在可以开始使用memcache并完成它,或者你现在可以使用上面的方法之一,然后最终切换到memcache,从而导致更多的工作。此外,您不必处理运行cronjob或其他丑陋的黑客攻击来获得缓存过期功能:它可以为您提供缓存过期功能。

mysql查询缓存很好,但它不是没有issues。其中最重要的一点是,每次源数据更改时都会自动过期,这可能不是您想要的。