【问题标题】:Django ordering efficiency with joins - can I force a subquery?使用连接的 Django 排序效率 - 我可以强制使用子查询吗?
【发布时间】:2013-10-21 22:41:02
【问题描述】:

这涉及带有 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

这是因为生成的查询是

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,因为管理系统的其余部分需要一个查询集来进行分页和过滤。

非常感谢任何帮助。

【问题讨论】:

    标签: python mysql sql django django-admin


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2013-03-05
      • 2021-11-23
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多