通过随时间变化计算队列大小的SQL结构

时间:2013-06-06 01:59:30

标签: mysql sql database-design data-structures

当项目不断从队列移动到队列时,如何设计一个SQL数据结构,让我可以查询一个队列的大小(多少条记录)随着时间的推移(所以我可以绘制它)。

表:

Queue
--------------------------------------
item_id      int
status       enum('new','ready','old')

Log
--------------------------------------
item_id      int
old_status   enum('new','ready','old')  --perhaps record new_status instead?--
change_date  timestamp

每次项目更改状态(即新队列)时,我都会将其记录在日志中。

如何编写一个查询,告诉我“在10:00时,'新'中有X条记录,'准备'中有Y条等”。并且全天都这样做,所以我可以绘制它。

我不想每隔5分钟制作一张总表,因为我不知道我的时间粒度。

我非常愿意更改数据库结构,并添加新字段以使其正常工作。

2 个答案:

答案 0 :(得分:1)

如果日志同时记录了新状态和旧状态,则可以向表中添加新的伪列,作为递增和减少每个状态的计数器:

SELECT 
    l.change_date
    CASE WHEN l.new_status = 'new'   THEN 1 WHEN l.old_status = 'new'   THEN -1 ELSE 0 END AS new_count
    CASE WHEN l.new_status = 'ready' THEN 1 WHEN l.old_status = 'ready' THEN -1 ELSE 0 END AS ready_count
    CASE WHEN l.new_status = 'old'   THEN 1 WHEN l.old_status = 'old'   THEN -1 ELSE 0 END AS old_count
  FROM log l
  ORDER BY l.change_date

将伪列汇总到特定日期应该会为您提供该日期的活动计数。分析SUM函数听起来像是正确的工具。这假设旧状态和新状态永远不会相同。也许你可以应用类似的东西。

答案 1 :(得分:1)

如果您认为查询log表的成本很高,您可以创建一个快照表,该表将捕获每个队列中的记录数,例如每天。在每天结束时,向此表插入新行。因此,要随时查找数字,您可以在当天的这段时间内将更改应用于前一天结束时拍摄的快照。如果您对change_date表中的log列编制索引,我认为此查询运行速度非常快。