排除许多用户的“看到”数据库行

时间:2014-01-04 13:57:26

标签: mysql join left-join

在iPhone应用程序“Houzz”中,您可以逐个浏览数以百万计的家居室内照片。

我假设他们正在存储您在数据库中看到的照片,然后执行类似下面的查询,并在用户看到前100张照片时再次查询。

select photos.id from photos left join seen ... 
where seen.id is null and user.id = $USERID order by photos.created desc 
limit 100

这适用于几千个用户和几千张照片,但是有数百万张照片,并且越来越多的用户正在观看它们,这会呈指数级增长并且会崩溃。

如何使用单个(最好是关系型)数据库服务器来解决这样的问题?

或者,如果不诉诸庞大的数据库服务器集群以及随之而来的所有复杂性和令人头痛的问题,它只是其中一个不可行的事情吗?

请注意!这是一个先决条件,需要命令查询相对经常包括新到达的照片(如果不是立即)。

1 个答案:

答案 0 :(得分:0)

我当然更喜欢左边连接“不存在” - 它应该更快。

select photos.id from photos
where not exists
(select 1 from seen where user.id=$USERID and seen.photoId=photos.id)
order by photos.created desc 
limit 100

您也可以通过“上次上传日期”或某些内容进行更新以进一步限制该范围内的图片..也许只显示x个月的图片..这通常应该涵盖您的100张图片限制或类似的内容