索引一组字符串的“最后添加”行

时间:2019-01-10 11:24:13

标签: sql postgresql indexing

我有一个数据库,其中包含1Mil +行。 这个数据库由两列组成(出于这个问题); user_id和用户名。 这些值不受我的应用程序控制;我并不总是确定这些是当前正确的值。我所知道的是,保证user_id是唯一的。我得到了定期更新,这使我可以更新数据库,以确保我的user_id / username映射具有“最终一致”的版本。

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

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

根据我对索引的了解,这听起来像是它的更快选项(并且不需要我检查数据库中1Mil行的唯一性)。我还听说哈希表很麻烦,因为它们需要重建,因此随时提出其他想法。

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

给出一个示例数据库:

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

1 个答案:

答案 0 :(得分:0)

您可以使用:

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);

这可能需要很短的时间,但是您还是要进行更新。