假設我有一個包含一千個用戶和五千萬個user_actions的表。少數用戶有超過一百萬次的行動,但大多數有數千次。Postgres索引最近的外鍵
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_actions
通過user_id
是快速的,使用索引。
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個動作!)
或者,建議備用策略?我想一個窗口函數的物化視圖將會做到這一點。
https://stackoverflow.com/questions/tagged/greatest-n-per-group+postgresql –