2016-11-06 14 views
1

有没有办法保存在一个文件中的特定MySQL查询输出我的应用程序服务器(而不是数据库服务器)上更新该数据每n秒,使用户不发送查询我的数据库,但只是加载缓存输出?缓存SQL查询的应用程序服务器上的输出

我想过用它打开了执行查询和数据保存到当用户要求的数据装载的文件中的特定.PHP一个crontab。如果这是一个好主意,是否有可能使这个.php文件不能从公共http请求中访问?

+0

雁鹅追逐。为什么你甚至想这样做? – e4c5

+0

为了减少我的分贝上的IOPS。 –

+0

应该没有必要这样做。 MySql已经有了[查询缓存](http://dev.mysql.com/doc/refman/5.7/en/query-cache.html),所以如果有的话,你不会获得太多的收益。 – trincot

回答

2

首先,这可能不是一个好主意。如果您的目标是减少I/O,那么当用户负载很低时,实际上可能会增加I/O。

其次,如果你这样做,你可能需要编写自定义代码,以保持本地缓存。然后,您会遇到缓存争用问题 - 特别是在写入和读取同时发生时。

第三,如果问题是,查询时间太长(这是因为你专注于I/O带宽不明确),然后优化数据库和查询将是第一步。

第四,从数据库返回给应用程序大量的数据往往表明数据接口的设计不良。思考需要什么可能会非常有帮助。例如,也许在服务器上排序并返回前10行是最佳解决方案。或者,也许,依靠数据库方面是正确的解决方案。

最后,这种类型的任何解决方案必然意味着本地缓存可以与数据库出不同步。这通常是这种方法的杀手问题。

所有这些都可以解决,但它们通常会使代码更加复杂。如果你现在没有真正的性能问题,那么请记住Knuth的建议:“不成熟的优化是万恶之源。” (我同意这种观点,但世界上肯定存在其他邪恶;)

+0

谢谢您的详细解答。我正在开发一个浏览器扩展,只是不希望我的服务器崩溃,如果它病毒。我想要缓存的查询对每个用户来说都是一样的,不管它是否与数据库100%同步都没关系,但是我会首先尝试查看它是否可以在没有我的“复杂”方法的情况下运行。谢谢 –

+0

@JuliusS。如果它发生病毒,并且你有一个可行的收入模式,那是一个甜蜜的问题。我会把“过早缓存”称为“甚至是邪恶”类别,因为在很多情况下,从性能的角度来看,这只是一种错觉。 – YvesLeBorg

+0

@YvesLeBorg好吧,那么我想我可以开始研究其余的代码,并忘记这个“问题”:D –

相关问题