页面加载时SQL调用太多了?

时间:2012-06-16 12:48:41

标签: php mysql

我正在私人日托中心为一小部分父母建立一个网站。该网站的一个理想功能是拥有一个日历,您可以在其中选择负责清理区域设置的日期。现在,我已经制作了一份工作日历。我在网上发现了一个简单的脚本,我修改了abit以符合我们的目的。从技术上讲,它运作良好,但我开始怀疑我是否真的应该改变它从数据库中提取信息的方式。

日历按月呈现,并使用for循环绘制为表格。这意味着每次加载页面时,所述for循环运行28-31次,具体取决于月份。为了介绍谁负责每天清洁,我已经添加了一个MySQL数据库的调用,其中存储了每个成员的清洁日。伪代码看起来像这样,简化:

Draw table month
    for day=start_of_month to day=end_ofmonth
        type day
        select member from cleaning_schedule where picked_day=day
        type member

这意味着页面的每次重新加载都会对数据库进行至少28次SELECT调用,而对我而言似乎效率低下且可能容易受到DDOS攻击。是否有更有效的方法来获得相同的结果?那里有更复杂的预订日历,他们如何处理?

5 个答案:

答案 0 :(得分:5)

SELECT picked_day, member FROM cleaning_schedule WHERE picked_day BETWEEN '2012-05-01' AND '2012-05-31' ORDER BY picked_day ASC

您可以遍历该查询的结果,每行都会按照您选择的范围中的日期和人员按升序排列。

答案 1 :(得分:2)

MySQL查询缓存将保存您的培根。

简短版本:如果经常重复相同的SQL查询,只要基础表没有更改,它最终将在没有表访问的情况下提供。所以:一个月的第一个电话将是ca. 35 SQL查询,这很多但不是太多。同一页面的第二次加载将从缓存中快速返回结果。

我的经验表明,这比创建花哨的连接查询要快得多,即使这样做也可能。

答案 2 :(得分:2)

不是28个电话是一个大问题,但我会使用一个连接并在一个点击中调用整个月的数据。然后,您可以遍历MySQL Query结果,就像它是一个数组一样。

答案 3 :(得分:1)

您可以在SQL中使用越来越大的内容。因此,不是每天进行一次选择,而是可以为整个月编写一个选择:

SELECT day, member FROM cleaning_schedule 
WHERE day >= :first_day_of_month AND day >= :last_day_of_month
ORDER BY day;

然后,您需要在程序中注意每天处理多个成员。虽然程序逻辑会稍微复杂一点,但程序会更快:进程间甚至基于网络的通信比附加逻辑慢得多。

根据数据结构的不同,以下语句可能更方便:

SELECT day, group_concat(member) FROM cleaning_schedule 
WHERE day >= :first_day_of_month AND day >= :last_day_of_month
GROUP BY day
ORDER BY day;

答案 4 :(得分:1)

28个查询不是一个大问题,对于大多数商业网站来说都很常见,但建议只需每个月抓一次即可获取月度数据。然后每天循环浏览记录。