Django通过连接订购效率 - 我可以强制子查询吗?

时间:2013-10-14 11:19:04

标签: python mysql sql django django-admin

这涉及带有MySQL后端的Django 1.4.6。当使用连接执行有序查询时,Django会将排序子句放在查询的末尾。想象一下像

这样的模型
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 < / p>

这是因为生成的查询是

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管理系统并拥有一个list_display,需要在数千个大型记录中进行大量连接。我无法使用原始sql,因为管理系统的其余部分需要一个用于分页和过滤的查询集。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以直接使用SQL查询。 Django允许开箱即用的raw SQL查询,它确实返回一个QuerySet(特别是一个RawQuerySet),据我所知,它表现为普通的QuerySet。