Laravel MySQL 应用程序中基于时区显示数据聚合的更好性能解决方案

问题描述 投票:0回答:1

我们正在开发一个网站,该网站将在基表中包含大量用户数据。时间戳以 UTC 格式保存在 MySQL 表中。应用程序中的仪表板将以不同的图表显示聚合数据,用户还可以选择“时区”。

更改时区时,应相应地选择/调整数据。为了获得更好的应用程序性能,我们希望将仪表板的聚合数据存储在一些报告表中。

以下是时区的一些示例:

澳大利亚尤克拉为 UTC +08:45,亚洲加德满都为 UTC +05:45,亚洲喀布尔为 UTC +04:30,太平洋马克萨斯为 UTC -09:30。

据我们了解,时区差异至少为15分钟。

因此我们认为也许一种方法是根据 15 分钟的时间段将数据聚合到报告表中。这意味着 8:00 到 8:15 的数据将被计算并存储在一个表行中。

8:15到8:30的数据将存储在下一行,以此类推。

任何人都可以指导我们,对于我们的要求有什么更好的解决方案吗?

mysql laravel performance timezone aggregate
1个回答
0
投票

是的,你的方法是正确的。但与所有事情一样 - 这取决于情况。

在这种情况下,这具体取决于您要查询的内容。如果您预先聚合到 15 分钟的桶中,那么即使根据时区进行调整,也会以 15 分钟为间隔进行自然分区。如果您选择了 1 小时或 30 分钟的存储桶,那么对于某些时区,当使用看似正常的分区(例如每日或每小时查询)时,数据将位于两个不同的存储桶中。使用 15 分钟的时间段可以避免这个特殊问题。正如您所发现的,所有现代时区都与 UTC 偏移一定的小时数以及 0、30 或 45 分钟 - 因此 15 分钟的时间段是理想的。

也就是说,还有其他方法。我能想到你应该探索的两个:

  1. 是否需要按所有时区查询数据?如果您只关心几个时区,您可以保留原始 UTC

    timestamp
    列,只需为您关心的每个时区添加另一个
    datetime
    列,存储该时区的等效本地日期和时间。

  2. 数据到底需要按时间查询吗?还是只是通过约会?如果是后者,那么您可以保留一个 UTC

    timestamp
    列,并保留一个单独的
    date
    列,而不包含任何时间组件。仅日期列非常适合生日、周年纪念日、工作日期和其他类型的“工作日”。

© www.soinside.com 2019 - 2024. All rights reserved.