PHP性能:每次点击查询数据库?

时间:2011-12-07 11:41:44

标签: php mysql sql performance yii

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

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

问题:以这种方式制作它是否值得,而我可以每天制作一些“准备好的”静态文件或表格,包含新鲜事件及其数据?

还有一个问题:你建议使用Yii吗?因为我的本地主机似乎有点慢。

2 个答案:

答案 0 :(得分:0)

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

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

每页1个查询请求实际上没什么,即使使用缓存可以获得轻微的性能提升,但实际上只为1个查询实现这一点并不值得。

我有一个网站,在某些网页上最多可以执行200多个查询。我将页面缓存,以便每隔几分钟调用一次数据库,以确保我没有在每个页面加载时执行相同的查询。即5分钟后,当用户发出请求时,缓存文件已过期,然后从数据库加载新内容。

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

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

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

对于框架,您可以使用您想要的内容。它们都可以进行优化以快速运行。选择是你的。

总结一下:

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

答案 1 :(得分:0)

请勿在查询中使用NOW() NOW()不能缓存到mysql查询缓存中。

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

  

如果查询包含下表中显示的任何功能,则无法缓存该查询   NOW()

在左手边比较中始终使用常数 在您的情况下,您从日期时间(或时间戳)到日期进行类型转换,
这是一个糟糕的习惯,请考虑一下: -

$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上构建一个复合索引 如果where子句总是需要比较两列

将所有内容存放在静态中是好的,
但是当有更新时,需要更多努力使缓存失效/无效。

是否使用Yii是次要考虑因素,首先解决明显的问题 (这是昂贵的mysql查询)。