Postgres 索引最近的外键
Postgres index most recent by foreign key
假设我有一个 table,拥有 1000 名用户和 5000 万 user_actions。一些用户的操作超过一百万,但大多数用户有数千。
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
此查询抛出索引并执行 table 扫描,向后扫描直到找到操作。对于最近活跃的用户来说不是问题,对于没有活跃的用户来说太慢了。
有没有办法调整这个索引,以便 postgres 跟踪每个用户的最后一个操作? (最后N个动作加分!)
或者,建议的替代策略?我想 window 函数的物化视图可以解决问题。
在 (user_id, created_at)
上创建索引
这将允许 PostgreSQL 进行索引扫描以定位第一条记录。
这是 multi-column 索引产生重大影响的情况之一。
请注意,我们将 user_id 放在首位,因为这使我们能够高效地 select 我们感兴趣的索引的 sub-portion,然后从那里快速遍历到获取最近的 created_at 日期,前提是该地区没有很多死行。
假设我有一个 table,拥有 1000 名用户和 5000 万 user_actions。一些用户的操作超过一百万,但大多数用户有数千。
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
此查询抛出索引并执行 table 扫描,向后扫描直到找到操作。对于最近活跃的用户来说不是问题,对于没有活跃的用户来说太慢了。
有没有办法调整这个索引,以便 postgres 跟踪每个用户的最后一个操作? (最后N个动作加分!)
或者,建议的替代策略?我想 window 函数的物化视图可以解决问题。
在 (user_id, created_at)
这将允许 PostgreSQL 进行索引扫描以定位第一条记录。
这是 multi-column 索引产生重大影响的情况之一。
请注意,我们将 user_id 放在首位,因为这使我们能够高效地 select 我们感兴趣的索引的 sub-portion,然后从那里快速遍历到获取最近的 created_at 日期,前提是该地区没有很多死行。