我有一个数据库,其中包含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分配给哪个用户名没有线性关系。
答案 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);
这可能需要很短的时间,但是您还是要进行更新。