这与Django1.4.6和MySQL后端有关。当使用连接执行有序查询时,Django将把ordering子句放在查询的末尾。想象一下一些模型
class MainObject(models.Model):
pass
class RelatedObject(models.Model):
main_object = models.ForeignKey(MainObject)
如果您有很多这样的查询,并尝试一个查询,例如RelatedObject.objects.select_related('main_object').order_by('-id') limit 20000
,那么根据连接的数量,它的速度几乎是没有排序的同一个查询的两倍:RelatedObject.objects.select_related('main_object') limit 20000
这是因为生成的查询是
SELECT app_relatedobject.id, app_relatedobject.main_object_id, app_mainobject.id
FROM app_relatedobject
INNER JOIN app_mainobject ON (app_relatedobject.main_object_id = app_mainobject.id)
ORDER BY app_relatedobject.id DESC
LIMIT 20000
比同等的要慢得多
SELECT tmp.id, tmp.main_object_id, app_mainobject.id
FROM (
SELECT app_relatedobject.id, app_relatedobject.main_object_id
FROM app_relatedobject
ORDER BY app_relatedobject.id DESC
LIMIT 20000) tmp
INNER JOIN app_mainobject ON (app_relatedobject.main_object_id = tmp.id)
有没有什么方法可以有效地实现我的目标?在上下文中,我使用的是django管理系统,并且有一个列表显示,它需要跨越数千条大记录的大量连接。我不能使用原始sql,因为管理系统的其余部分需要一个用于分页和筛选的查询集。你知道吗
非常感谢您的帮助。你知道吗
您可以直接使用SQL查询。Django允许开箱即用的raw SQL查询,它确实返回一个QuerySet(特别是一个RawQuerySet),据我所知,它的行为就像一个普通的QuerySet。你知道吗
相关问题 更多 >
编程相关推荐