gpt4 book ai didi

mysql - Django admin MySQL 慢 INNER JOIN

转载 作者:可可西里 更新时间:2023-11-01 06:35:48 27 4
gpt4 key购买 nike

我有一个包含 3 个 ForeignKey 字段的简单模型。

class Car(models.Model):
wheel = models.ForeignKey('Wheel', related_name='wheels')
created = models.DateTimeField(auto_now_add=True)
max_speed = models.PositiveSmallIntegerField(null=True)
dealer = models.ForeignKey('Dealer')
category = models.ForeignKey('Category')

对于 django 管理中的 ListView ,我得到 4 个查询。其中之一是带有 3 个 INNER JOINS 的 SELECT。那个查询是一种减慢方式。将 INNER JOIN 替换为 STRAIGHT_JOIN 将解决此问题。有没有办法在评估之前修补管理员生成的查询?

最佳答案

我已经为 Django ORM 实现了 INNER JOIN 的修复,它将在使用 INNER JOIN 进行排序的情况下使用 STRAIGHT_JOIN。我与 Django core-devs 进行了交谈,我们决定暂时将其作为一个单独的后端来执行。所以你可以在这里查看:https://pypi.python.org/pypi/django-mysql-fix

但是,还有另一种解决方法。使用 James 的回答中的片段,但将 select_related 替换为:

qs = qs.select_related('').prefetch_related('wheel', 'dealer', 'category')

它将取消 INNER JOIN 并使用 4 个单独的查询:1 个用于获取汽车,3 个使用 car_id IN (...)。

更新:我找到了另一种解决方法。在 ForeignKey 字段中指定 null=True 后,Django 将使用 LEFT OUTER JOIN 而不是 INNER JOIN。 LEFT OUTER JOIN 在这种情况下没有性能问题,但您可能会遇到我还不知道的其他问题。

关于mysql - Django admin MySQL 慢 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15959083/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com