【问题标题】:MySQL query with list of values带有值列表的 MySQL 查询
【发布时间】:2017-07-20 08:38:53
【问题描述】:

我有一个超过 50kk 行的表格。

跟踪点:

+----+------------+-------------------+
| id | created_at | tag               |
+----+------------+-------------------+
|  1 | 1484407910 | visitorDevice643  |
|  2 | 1484407913 | visitorDevice643  |
|  3 | 1484407916 | visitorDevice643  |
|  4 | 1484393575 | anonymousDevice16 |
|  5 | 1484393578 | anonymousDevice16 |
+----+------------+-------------------+

其中“created_at”是添加行的时间戳。 我有一个时间戳列表,例如这个:

timestamps = [1502744400, 1502830800, 1502917200]

我需要在时间戳的 i 和 i+1 之间的每个间隔中选择所有时间戳。

使用 Django ORM 它看起来像:

step = 86400
for ts in timestamps[:-1]:    
    trackpoint_set.filter(created_at__gte=ts,created_at__lt=ts + step).values('tag').distinct().count()

因为实际上时间戳列表非常长并且表有很多行,最后我得到 500 超时

所以,我的问题是,如何在一个原始 SQL 查询中连接行和值列表,所以它看起来像 [(1502744400, 650), (1502830800, 1550)...]

其中第二个第一个值是时间戳,第二个是每个间隔中唯一标签的计数。

【问题讨论】:

  • 谢谢,我更正了我的问题
  • 你有关于 created_at 的索引吗?如果是大型查询,索引可能会给您带来巨大的性能提升。
  • 是的,我这样做了,我尝试了 UNIQUE pair tag-created_at,这也没有帮助
  • 无论如何,您的示例中有一个最小时间戳和最大时间戳(1502744400 和 1502917200),因此您可以将查询限制在该范围内。

标签: mysql django


【解决方案1】:

第一个索引created_at。下一个构建查询,如created_at in (timestamp, timestamp+1)。对于每个时间戳,逐个运行查询,而不是一次全部运行。

【讨论】:

  • 如我所说,因为表很大,数组也很长,我得到 504 Gateway Time-out
  • 请一次尝试一批。
  • 对不起,这没有帮助,如果我的步骤 id 10 分钟(600 秒)在一天(86400 秒)的时间段内,我实际上得到了 144 次迭代。最后我得到 504
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 2014-11-14
相关资源
最近更新 更多