Django排序效率与联接我可以强制子查询吗?

2024-09-30 01:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

这与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,因为管理系统的其余部分需要一个用于分页和筛选的查询集。你知道吗

非常感谢您的帮助。你知道吗


Tags: fromidappmodelobjectsobjectmainmodels

热门问题