【发布时间】:2020-08-28 01:14:00
【问题描述】:
这是我的查询的样子:
SELECT DISTINCT user.id AS user_id, messaged_date
FROM users
JOIN (
SELECT MIN(message_date) AS messaged_date,
user_id
FROM messages
GROUP BY user_id
) messages_join ON user.id = messages_join.user_id
WHERE (user.client_id IN ('1234')
AND user.status IN ('statusA')
);
-
messages表有两列 ->user_id和messaged_date。我有一个索引和多列索引(user_id, messaged_data asc nulls last) -
messages桌子很大。大小约为 50Gb。 - 查询需要很长时间(5 分钟以上)才能运行。
- 如果我删除连接,它会在 1 秒内返回。
- 我想要每个
user_id一行
如何使查询执行得更快?显然,min 加上 group_by 的加入是原因。 (EXPLAIN 证实了这一点。)
我尝试了loose index scan, aka a "skip scan",它本身性能很好,但在加入它的结果时没有帮助。
【问题讨论】:
-
你想做什么?
-
获取用户收到消息的最早日期,在
client_id和status上过滤 -
这不是您的查询所做的......
-
我的错,我在选择子句中添加了缺少的
messaged_date
标签: sql postgresql query-optimization amazon-aurora