【发布时间】:2012-03-16 17:46:09
【问题描述】:
我们正在为我们的初创公司构建一个调度系统。
这只是一个普通的,除了我们愿意实现的“自动查找”功能。灯架构。没什么特别的。
这就是 DB 的样子。三个主表:
- 办公室(id、start_time、stop_time)
- 人员(id、office_id、start_time、stop_time)
- 时间表(id、people_id、start_time、stop_time)
start_time/stop_time 是 TIMESTAMPS。
表格不需要这样。这正是我们目前拥有的。
Offices 表有一个办公室的打开/关闭时间。这张桌子可以大到每个办公室 365 天,因为每天的开/关时间不一样。请注意,最多可以有 1000 个办公室。这使得表中大约有 365,000 多条记录。
人有加入/离开时间。这显然比办公室更严格。同样,一年中的每一天人们都可以有不同的访问时间。每个办公室大约有 50 人。这使得 1000 个办公室 * 365 天 * 50 名员工 = 18,250,000 条记录。
时间表就是谁会见谁。每个人每天最多可能有 10 次会议。是的,此时这可以轻松地在此表中创建 1.825 亿行。
除了 大 数字之外没有什么奇怪的。应用程序需要做的是:给定办公室、要见面的人和持续时间,显示前 5 个可用日期。
据我们所知,这个应用程序将完全杀死我们的服务器。我们只是不顾一切地进行这次比赛。我们首先想到的是“这根本不可能”。但是,嘿!在软件中一切皆有可能,不是吗?
PS:如果有人想出更好的方法使应用程序可行,我们将真的感激它。
非常感谢您的阅读。希望有铁杆程序员能帮帮我们。
更新:
出于测试目的,我们创建了两个完全相同的表:
会议和办公室(id、profesional、start、stop)。
ID 为主,其余为 BTREE 索引。 SQL 是这样的(不能 100% 工作):
SELECT a.profesional, a.stop AS desde, Min(b.start) AS hasta
FROM meetings AS a
JOIN meetings AS b
ON a.profesional=b.profesional
AND a.stop < b.start
WHERE a.profesional = 1
AND b.profesional = 1
GROUP BY a.start
UNION
SELECT m.profesional, MIN(m.start), MIN(j.start)
FROM offices m
JOIN meetings j
ON j.profesional = m.profesional
WHERE j.profesional = 1
AND m.profesional = 1
UNION
SELECT m.profesional, MAX(j.stop), MAX(m.stop)
FROM offices m
JOIN meetings j
ON j.profesional = m.profesional
WHERE j.profesional = 1
AND m.profesional = 1
ORDER BY desde ASC
我们所做的如下。只需添加 1 个办公室,时间为 240 天。每天有 8 次会议,总共约 2000 行。执行此类查询需要 2.6 (!) 秒。查询错了吗?可以重写吗?
【问题讨论】:
-
描述很清楚,但如果您提供列名和数据类型会更好。
-
抱歉,我刚刚添加了架构。
-
您可以考虑使用基于 Web 的服务,例如 Amazon 或 Cloud。
-
@alexy13:现在有“The”云了吗?
-
将
UNION更改为UNION ALL肯定会有所帮助。
标签: php mysql architecture