1

我有一张表,其中包含以下结构和数据,代表停车位的状态:

id  bayID   state     starttime
1   1       FREE      2013-08-09 09:13:02
2   1       OCCUPIED  2013-08-09 09:15:50
3   1       FREE      2013-08-09 09:33:15
4   1       OCCUPIED  2013-08-09 09:35:10
5   1       FREE      2013-08-09 10:03:22

我现在需要计算一个海湾的平均停车占用时间。由于记录可能有数百万,我正在寻找执行此操作的最佳方法,以便可以快速完成查询平均值。

我的想法是将上表中的数据预处理到另一个已经计算停车时间的表中。这将通过为一个间隔找到一对 OCCUPIED 和 FREE 条目来完成,然后计算开始时间之间的时间差。这可以给我一个这样的结构:

bayID   starttime             duration
1       2013-08-09 09:15:50   ...
1       2013-08-09 09:35:10   ...

然后我可以在 2 个日期时间之间查询并平均持续时间。

如果这似乎是推荐的方法,我想知道如何创建计算数据集。我想我可以:

  • 创建一个触发器,在第一个表中插入后执行,进行计算并在需要时插入另一个表。
  • 在第一个表上创建一个视图。不幸的是,我没有足够的 MySQL 知识来知道这是否可能。

在我深入编码之前,有人可以就提议的解决方案给我一些建议吗?它们都可行吗?使用其中一种的(缺点)优势是什么?

4

1 回答 1

1

你正在寻找建议,所以这是我的两分钱......

两者都可行吗

MySQL 支持触发器和视图。所以从技术上讲,这两种解决方案都是可行的。

  • 创建一个触发器,在第一个表中插入后执行,进行计算并在需要时插入另一个表。
  • 在第一个表上创建一个视图。不幸的是,我没有足够的 MySQL 知识来知道这是否可能。

起初使用触发器似乎是一种有趣的方法,因为它可以让你实时更新你的职业表。但这会增加数据库的平均负载,如果经常触发它,可能会达到不可接受的程度。在“好的方面”,触发器中的查询可能比您的其他解决方案更轻量级。

MySQL 支持视图,但您必须记住,这些是在视图创建时制作的静态快照。MySQL 中没有“实时视图”之类的东西。这意味着您需要定期重新创建该视图(cronjob?)。每晚说一次?根据您的需要,这种延迟可能会或可能不会被接受。此外,既然您说您有数百万条记录,那么可能每晚的数据整合可能会给当时的数据库带来重要的负担。如果您运行 24/7 应用程序,这可能是不可接受的。

作为一个粗略的结论,两种解决方案都有利有弊,考虑到您对系统的描述,我想说没有明确的赢家。也许有人可以提出更合适的第三种解决方案......

希望这至少有一点帮助;)


于 2013-08-09T17:39:06.660 回答