3

我正在为私人日托中心的一小部分父母构建一个网站。该站点所需的功能之一是有一个日历,您可以在其中选择您可以负责清洁区域的日期。现在,我制作了一个工作日历。我在网上找到了一个简单的脚本,我对其进行了修改以适应我们的目的。从技术上讲,它运行良好,但我开始怀疑我是否真的应该改变它从数据库中提取信息的方式。

日历每月显示一次,并使用 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 攻击。有没有更有效的方法来获得相同的结果?那里有更复杂的预订日历,他们如何处理?

4

5 回答 5

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

您可以遍历该查询的结果,每一行将有一个日期和您选择的范围内的一个人,按日期升序排列。

于 2012-06-16T12:54:00.443 回答
2

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

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

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

于 2012-06-16T12:54:23.850 回答
2

并不是说 28 次通话有什么大不了的,但我会使用一次连接并调用整个月的数据。然后,您可以遍历 MySQL 查询结果,就好像它是一个数组一样。

于 2012-06-16T13:14:07.280 回答
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;
于 2012-06-16T12:56:47.070 回答
1

28 次查询对于大多数商业网站来说并不是一个大问题,而且很常见,但建议您只需在每个月一次点击就获取您的月度数据。然后每天循环浏览记录。

于 2012-06-16T12:58:37.880 回答