【发布时间】:2017-02-15 18:11:17
【问题描述】:
假设我有一个包含一千个用户和 5000 万个 user_action 的表。少数用户拥有超过一百万个操作,但大多数用户拥有数千个操作。
CREATE TABLE users (id, name)
CREATE TABLE user_actions (id, user_id, created_at)
CREATE INDEX index_user_actions_on_user_id ON user_actions(user_id)
使用索引通过user_id 查询user_actions 速度很快。
SELECT *
FROM user_actions
WHERE user_id = ?
LIMIT 1
但我想知道用户的最后操作。
SELECT *
FROM user_actions
WHERE user_id = ?
ORDER BY created_at DESC
LIMIT 1
此查询抛出索引并执行表扫描,向后直到找到操作。对于最近活跃的用户来说不是问题,对于没有活跃的用户来说太慢了。
有没有办法调整这个索引,以便 postgres 跟踪每个用户的最后操作? (对于最后 N 次行动的奖励积分!)
或者,建议的替代策略?我想窗口函数的物化视图可以解决问题。
【问题讨论】:
标签: sql postgresql greatest-n-per-group