Python Django连接排序效率-我可以强制子查询吗?

Python Django连接排序效率-我可以强制子查询吗?,python,mysql,sql,django,django-admin,Python,Mysql,Sql,Django,Django Admin,这与Django 1.4.6和MySQL后端有关。当使用连接执行有序查询时,Django将把ordering子句放在查询的末尾。想象一下一些模型,比如 class MainObject(models.Model): pass class RelatedObject(models.Model): main_object = models.ForeignKey(MainObject) 如果您有很多这样的查询,并尝试诸如RelatedObject.objects.select_re

这与Django 1.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,因为管理系统的其余部分需要一个用于分页和筛选的queryset


非常感谢您的帮助。

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