sql—仅查询最新条目的性能

mm5n2pyu  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(271)

我做了一个应用程序,当一个工人到达和离开的前提下保存。
在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,因为很少执行以前几天的查询。否则,我将不得不处理超时。

7rfyedvj

7rfyedvj1#

我将使用以下索引 departed_at 在探测表之前,可以消除不匹配:

CREATE INDEX ON activities (arrived_at, departed_at);
kqqjbcuj

kqqjbcuj2#

在postgres上,您可以使用 DISTINCT ON :

SELECT DISTINCT ON (user_id) *
FROM activities
ORDER BY user_id, arrived_at::date DESC;

这假设您只想为每个用户报告由到达日期确定的最新记录。如果您只想在整个表中显示具有最新到达日期的所有记录,请使用:

SELECT *
FROM activities
WHERE arrived_at::date = (SELECT MAX(arrived_at::date) FROM activities);

相关问题