大表上的复杂查询

时间:2014-10-10 23:01:59

标签: mysql sql django performance

我有一个大用户表(3M),结构:

age  (int) 
country (FK) 
city (text) 
gender (text) 
active (bool)

我的目标是搜索15个给定年龄区,性别,城市和国家的用户(有利于活跃用户)。

由于桌子的大小,我有两个问题:

  • 即使使用索引编制,也需要很长时间(几百个) 毫秒)

  • 每次运行查询时,结果必须不同。目前我执行 使用LIMIT 30查询并从中获取随机的15个结果,但是 30个结果总是一样的。整张桌子太大了 混洗。

是否有一些常用的解决方案可以解决类似问题?

数据库服务器是MySQL,在Django中实现。我也可以访问Redis缓存。

1 个答案:

答案 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

的SQL语句

您可以看到执行类似操作的网站。比如谷歌的结果。转到第二页或第三页,您会注意到一个网址参数&start=60。并不意味着我知道谷歌如何运作,但这是基本原则。