【问题标题】:Is there any advantage to calculating the duration in MySQL as opposed to calculating duration in PHP (and then storing in MySQL)?与在 PHP 中计算持续时间(然后存储在 MySQL 中)相比,在 MySQL 中计算持续时间有什么优势吗?
【发布时间】:2012-02-02 15:58:04
【问题描述】:

问题:与在 PHP 中计算持续时间(然后存储在 MySQL 中)相比,在 MySQL 中计算持续时间有什么优势吗?

我打算计算每次活动完成的持续时间。持续时间将在 PHP 中计算,然后插入 MySQL 数据库(连同其他数据,如开始时间、结束时间、用户、活动等)。

但是,基于这个问题Database normalization: How can I tabulate the data?我得到的印象是,与其在插入时记录持续时间,不如根据保存在MySQL DB中的开始和结束值来计算它.

这听起来对吗?如果是,有人可以解释为什么吗?是否有任何推荐的方法来计算存储在 MySQL 中的值的持续时间?

编辑:

用户在线完成一项活动后,该活动的开始时间和结束时间将插入数据库。我打算使用这些值来计算持续时间(在 MySQL 中或在插入之前(使用 PHP)。持续时间稍后将用于其他计算。

【问题讨论】:

  • 持续时间是什么?它是特定的,还是只是在 2 次/时间戳之间?
  • @Janis Peisenieks 用户将执行一项活动。在活动完成时,开始和结束时间将被插入到数据库中。我打算使用这些值来计算持续时间(在 MySQL 中或在插入之前(使用 PHP)。

标签: php mysql


【解决方案1】:

我假设你有一个start_time 和一个end_time 作为你的duration 的基础,这两者都将存储在数据库中吗?那么是的,将duration 也存储在数据库中几乎没有优势。无论如何,它只是您已经存储的重复数据(持续时间 = 结束 - 开始,这是一个非常快速的计算),那么为什么要再次存储它呢?此外,这只允许数据不同步。假设某些错误会导致更新end_time,但不会更新duration。现在你有不一致的数据,没有真正的方法知道哪个是正确的。

【讨论】:

  • 或者,如果您在计算中不需要end_time,您可以将start_timeduration 存储在表格中,跳过end_time
  • @ypercube 我没有想到这一点。谢谢!
【解决方案2】:

我认为这取决于数据库的大小、服务器负载等...我有一些例子,在 PHP 中处理速度更快,而在其他时间在 MySQL 中处理。有很多因素会影响性能。

但是,要记住的是,您要避免多次数据库调用。如果您打算在 PHP 中尝试此操作,并遍历每条记录并更新每条记录,我认为 mysql 调用的数量可能会影响性能。但是,如果您在插入之前在 PHP 中计算持续时间,那么这是有道理的。如果数据已经在数据库中,那么单个更新语句可能是最好的选择。

只是我的 2c

【讨论】:

  • 感谢您的回复。我不会更新记录。当用户完成一项活动时,这会导致一个新条目被插入到数据库中(实时)。
【解决方案3】:

在我看来,这主要取决于具体情况,因此可能会在您的帖子中添加更多细节,以便更好地了解您的目标。

  • 如果您的程序有很多与数据库相关的操作,并且 数据库服务器比你的 PHP 服务器慢,它大约是 成千上万的计算,最好是 在你的 PHP 代码中计算它。
  • 如果您的程序没有离开 数据库非常孤独,你的代码已经做了很多 工作,也许让数据库做会更好 工作。
  • 如果您已经在表中存储了开始时间和结束时间, 存储持续时间通常是不必要的开销(可能 无论如何都要这样做,以提高数据库的性能 空间不是问题)。

但是,考虑到所有这些,我认为这个决定对于大多数应用程序来说并不重要,它很可能更多是个人喜好和偏好的问题。

【讨论】:

  • 此时,大部分工作都在代码中完成,但仍处于早期阶段。我预计这会在以后改变。谢谢你的回答:)
【解决方案4】:

我认为,最好在 MySQL 中创建 2 个单独的字段,而不是在 PHP 中计算持续时间。

以及原因

  • 虽然 MySQL 必须在每次检索时计算它可能是真的,但 MySQL 非常擅长这一点也是真的。通过创建一个制作精良的索引,这应该不会对性能产生负面影响。
  • 它为您提供了更多可使用的数据。可以说,您想了解用户何时完成他们的特定操作。如果只保留持续时间,则必须再次计算此时间,从而容易出错。保持另一个日期可能会派上用场。
  • 同样如此,如果您想计算多个用户的活动之间的一些差异。在这种情况下,预先计算的值会在 a*s 中造成麻烦,因为它会让您进行更多的反向计算。

所以在我看来 - 添加单独的字段。这不是规范化问题,因为您没有复制任何数据。然而,持续时间会。

【讨论】:

  • 看来 MySQL 是要走的路。谢谢回复:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2011-07-30
  • 2022-11-23
  • 2019-08-07
  • 2017-03-22
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多