数据库查询:Django的order_by()

时间:2017-09-26 02:36:08

标签: python sql django

我一直在教自己Django和SQL,我注意到的一件事是,当使用大型表(> 1,000,000条记录)时,指定一个排序非常缓慢。例如:

Model.objects()[offset:limit]

假设offsetlimit范围足够小,

可能需要几毫秒。但是:

Model.objects()[offset:limit].order_by('name')

可能需要10或20秒,具体取决于表中的行数。我明白为什么会这样;必须检查所有行以确保返回正确的结果。我也明白这是一个SQL问题而不是Django问题,我用Django代码解释它更容易。

所以这些是我的问题:

  1. 由于我看到Django生产网站显示来自极大表的有序数据,如果每次查询都花费10秒钟,他们如何实现这一目标?

  2. 解决第一个问题之后,如何扩展我的Django应用程序以允许排序多个列(名称,日期,值等)?

  3. 我的直觉说第一个问题的答案是按照我希望它显示的顺序插入每条记录,这样在执行查询时就不需要排序,但这似乎很难维护。

    此外,这意味着我能想到的第二个问题的唯一答案是创建多个表,这些表都按不同的列排序,然后像这样访问它:

    if request.GET['order'] == name:
        result_set = NameOrderedModel.objects()[offset:limit]
    elif request.GET['order'] == value:
        result_set = ValueOrderedModel.objects()[offset:limit]
    

    这些查询的代码相当简单,但我想到设置数据库需要做多少工作才能让这样的查询成为可能。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

是的,不应该那么慢。尝试在'名称'中添加索引。柱。这绝对应该让它回到毫秒级。对于那么多行,应该是一个索引。

其他一些建议:

1)为了便于阅读,我会在order_by之后执行offset:limit,如下所示:

Model.objects.all().order_by('name')[offset:limit]

2)如果仍有速度问题,请打印执行的sql:

data = Model.objects.all().order_by('name')[offset:limit]
print data.query

并在查询工具中进行一些故障排除,或者如果您仍然卡住,请尝试粘贴回来。