【问题标题】:Indexing the "last added" row of a set of strings索引一组字符串的“最后添加”行
【发布时间】:2023-04-01 20:30:02
【问题描述】:

我有一个数据库,其中有 100 万多行。 该数据库由(为了这个问题)2列组成; user_id 和用户名。 这些值不受我的应用程序控制;我并不总是确定这些是当前的正确值。我所知道的是 user_id 保证是唯一的。我得到定期更新,允许我更新我的数据库,以确保我有一个“最终一致”的 user_id/username 映射版本。

我希望能够检索某个用户名的最新添加; “较旧”的结果应该被忽略。

我相信这里有两种可能的方法: - 索引:应该有一个username:row(哈希图?)的索引,其中username始终是最后添加的用户名;所以在每一行添加或更新时都会更新。 - 将用户名设置为唯一,并执行on conflict update 将旧行设置为空字符串,将新行设置为用户名

根据我对索引的了解,这听起来像是更快的选择(并且不需要我检查数据库中 100 万行的唯一性)。我还听说 hashmap 很痛苦,因为它们需要重建,所以请随时提出其他想法。

我当前的实现对整个数据库进行了全面搜索,在超过 100 万行时开始变得非常慢。它当前获取此添加字符串的“最后一个”值;在这一点上,我什至不确定这是一个有效的假设。

给定一个示例数据库:

user_id, username
3      , bob
2      , alice
4      , joe
1      , bob
我希望搜索 `username = bob` 会返回 (1, bob)。 我不能依靠 ID 排序来解决这个问题,因为没有将 ID 分配给哪个用户名的线性关系。

【问题讨论】:

  • 。 .表代表无序集。除非您提供包含此信息的列,否则无法获取广告订单。

标签: sql postgresql indexing


【解决方案1】:

你可以这样做:

select distinct on (id) s.*
from sample s
where s.username = 'bob'
order by s.id desc;

为了提高性能,您需要在sample(username, id) 上建立索引。

或者,如果您正在进行定期批量更新,那么您可以构造一个表版本,每个 用户名 具有唯一行:

create table most_recent_sample as
    select max(id) as id, username
    from sample
    group by username;

create index idx_most_recent_sample_username on most_recent_sample(username);

这可能需要很短的时间,但无论如何您都在进行更新。

【讨论】:

  • ID 不一定是有序的;我不能依靠 ID 大小来确定最新的用户名,所以我认为这两种解决方案都行不通。 (抱歉信息缺失,已添加到帖子中)
猜你喜欢
  • 2013-05-06
  • 2011-08-13
  • 2013-05-30
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2013-09-18
  • 2018-01-31
相关资源
最近更新 更多