PHP性能:每次命中查询数据库


PHP Performance: Query to database on each hit?

我在数据库中有一个表EVENTS。(MySQL)当用户获取URL时www.example.com/today服务器执行PHP语句并对数据库进行SQL查询。

SELECT * FROM event WHERE DATE(date_end) >= DATE(NOW()) AND DATE(date_start) <= DATE(NOW())

问题:是否值得这样做,而我本可以每天用新鲜事件及其数据制作一些"准备好的"静态文件或表?

还有一个问题:你会建议使用Yii吗?因为它在我的本地主机上看起来有点慢

Yii支持缓存(我个人从未使用过Yii,因为我是一个symfony人,但这是无关紧要的)

你可以设置缓存文件的过期时间,比如6小时。6小时后,当用户请求该页面时,您的页面将使用数据库中的事件进行更新。

每个页面请求一个查询实际上没有什么,即使使用缓存可以获得轻微的性能提升,但是为了一个查询而实现它真的不值得。

我有一个网站,在一些页面上必须执行多达200+查询。我缓存了这些页面,以便每隔几分钟才调用一次数据库,以确保我不会在每次加载页面时执行相同的查询。例如,5分钟后,当用户发出请求时,缓存文件已经过期,然后从db加载新的内容。

你可以做优化。例如,看看YSlow。使用这个firefox插件,您可以查看页面上的瓶颈在哪里。也就是很多背景图像?将其转换为精灵。不使用CDN加载Jquery?然后使用CDN。使用宽度和高度属性调整图像大小?实际调整图像大小等

在PHP性能方面。看看APC,它是一个PHP加速器。当PHP应用程序变得复杂并且需要执行大量代码时,您应该会注意到显著的性能提升。但是,对于只调用一个查询的简单页面,那么您可能不会注意到太多的性能增益。

对于mysql,利用索引。如果您正在使用事件名称列搜索事件,请确保在该列上有索引。

对于框架,你可以使用你想要的。它们都可以被优化以快速运行。选择权在你。

总结一下:

为你所做的一切。如果它只是页面上的一个查询,那么使用缓存和框架就没有多大意义。如果你的应用程序确实变得复杂,并且你开始使用大量的查询,那么使用框架(代码分离、ORM、路由、表单验证等)并利用框架所提供的缓存功能将是有益的。

不要在查询中使用NOW()。

NOW()不能缓存到mysql查询缓存中。

文档:http://dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html

如果查询包含下表中所示的任何函数,则不能缓存。
现在()

在左侧比较中始终使用constant。
在您的例子中,您执行从datetime(或时间戳)到date的类型强制转换,
这是一个坏习惯,考虑一下:-

$start_date = date('Y-m-d 00:00:00', time());
$end_date = date('Y-m-d 23:59:59', time());
DATE(date_end) >= DATE(NOW()) AND DATE(date_start) <= DATE(NOW())
==>
date_end between $start_date and $end_date
and
date_start <= $end_date

更重要的是,在date_start和date_end上构建一个复合索引
If where子句总是要求比较两列

将所有内容存储在static中是可以的,
但是,当有更新时,它需要更多的努力来过期/无效缓存。

是否使用Yii是次要考虑的,先解决明显的问题