3

我有一个 MySQL 表,其中包含数十万个条目。

我需要指定一个日期范围并选择这两个日期之间的所有条目。然后,我需要逐小时分解条目并获取特定字段。

用例:我需要对 6 月 6 日到 6 月 12 日的条目进行逐小时细分。因此,在 6 月 6 日,我需要从上午 12 点到凌晨 1 点、凌晨 1 点到 2 点、凌晨 2 点到 3 点等的一系列条目。

哪个更快?(为什么!):

  1. 运行 144 个 SQL 查询到SELECT device_id FROM entries WHERE updated_at >= sometime AND updated_at <= sometime+1.hour某个时间是下午 12 点到下午 1 点,然后是下午 1 点到下午 2 点,等等。

  2. 运行 1 个 SQL 查询以SELECT device_id FROM entries WHERE updated_at >= start_date AND updated_at <= end_date获取整个时间段内的所有条目,然后使用 ruby​​ 按小时对条目进行分组。

如果有人有任何资源说明为什么 ruby​​ 或 MySQL 对于这种类型的东西可能更快,将不胜感激。想做一些阅读。

4

2 回答 2

2

SQL 数据库是为此类操作而构建的。使用它们!你总是可以做一些基准测试,但结果对我来说似乎非常可预测。

于 2013-06-12T18:45:14.283 回答
1

我认为最好的方法是在插入日志时使用 updated_at_month、updated_at_day、updated_at_hour(TINYINT - 因为所有值都非常小)索引字段,然后像这样选择范围和分组:

select device_id FROM logs where updated_at BETWEEN sometime AND some_other_time group by updated_at_month, updated_at_day, updated_at_hour

我假设 updated_at 是索引字段。

或者

select device_id FROM logs where updated_at_month=6 and updated_at_day>=6 and updated_at_day<=12 group by updated_at_day, updated_at_hour

但是,我们总共讨论了多少行?正如我注意到的那样,您从中选择了 device_id 字段,没有任何计数...或组...也许您应该select device_id, updated_at_day,updated_at_hour, count(*) as times

于 2013-06-12T19:19:22.797 回答