【问题标题】:Postgres index most recent by foreign key外键最近的 Postgres 索引
【发布时间】: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


【解决方案1】:

(user_id, created_at)上创建索引

这将允许 PostgreSQL 进行索引扫描以定位第一条记录。

这是多列索引产生重大影响的情况之一。

请注意,我们将 user_id 放在首位,因为这样我们可以有效地选择我们感兴趣的索引的子部分,然后从那里快速遍历获取最近的 created_at 日期,前提是不是很多该地区的死行。

【讨论】:

  • 可能还想按 desc 排序,具体取决于 SQL 的编写方式
  • 也许可以,但是您可以向前或向后扫描索引,因此在这种情况下不确定该查询是否会关心那么多
猜你喜欢
  • 2010-11-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
相关资源
最近更新 更多