【发布时间】: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),因此您可以将查询限制在该范围内。