我做了一个应用程序,当一个工人到达和离开的前提下保存。
在24小时内进行多次检查,因此数据库可以根据活动快速填充数百到数千条记录。
| user_id | device_id | station_id | arrived_at | departed_at |
|-----------|-----------|------------|---------------------|---------------------|
| 67 | 46 | 4 | 2020-01-03 11:32:45 | 2020-01-03 11:59:49 |
| 254 | 256 | 8 | 2020-01-02 16:29:12 | 2020-01-02 16:44:65 |
| 97 | 87 | 7 | 2020-01-01 09:55:01 | 2020-01-01 11:59:18 |
...
这成为一个问题,因为每日报告软件,稍后报告谁缺席或谁额外的时间,过滤器的到达日期。
查询将变为全表扫描:
(我刚刚在这个例子中使用了sqlite,但你明白了)
EXPLAIN QUERY PLAN
SELECT * FROM activities
WHERE user_id = 67
AND arrived_at > '2020-01-01 00:00:00'
AND departed_at < '2020-01-01 23:59:59'
ORDER BY arrived_at DESC
LIMIT 10
我要做的是使创建(到达)的记录的查询仅在最近一天进行snappier,因为很少执行以前几天的查询。否则,我将不得不处理超时。
2条答案
按热度按时间7rfyedvj1#
我将使用以下索引
departed_at
在探测表之前,可以消除不匹配:kqqjbcuj2#
在postgres上,您可以使用
DISTINCT ON
:这假设您只想为每个用户报告由到达日期确定的最新记录。如果您只想在整个表中显示具有最新到达日期的所有记录,请使用: