我有一个大用户表(3M),结构:
age (int)
country (FK)
city (text)
gender (text)
active (bool)
我的目标是搜索15个给定年龄区,性别,城市和国家的用户(有利于活跃用户)。
由于桌子的大小,我有两个问题:
即使使用索引编制,也需要很长时间(几百个) 毫秒)
每次运行查询时,结果必须不同。目前我执行 使用LIMIT 30查询并从中获取随机的15个结果,但是 30个结果总是一样的。整张桌子太大了 混洗。
是否有一些常用的解决方案可以解决类似问题?
数据库服务器是MySQL,在Django中实现。我也可以访问Redis缓存。
答案 0 :(得分:0)
您可以使用不同的限制和偏移来执行查询。 From the docs
你只需要跟踪你的位置。
# My example search criteria.
age = 21
gender = 'M'
city = 'Redmond'
country = 'US'
offset = 0
while True:
next_fifteen = User.objects.filter(age=age,
gender=gender,
city=city,
country=country)[offset:offset+15]
if not next_fifteen.exists():
break
<do whatever>
offset += 15
这将创建一个使用OFFSET 45 LIMIT 15
您可以看到执行类似操作的网站。比如谷歌的结果。转到第二页或第三页,您会注意到一个网址参数&start=60
。并不意味着我知道谷歌如何运作,但这是基本原则。