当ForeignKey null = True时,Django慢查询

Gad*_*ady 5 sql django postgresql foreign-keys

我在我的Django模型中设置null=True了一个ForeignKey字段,现在当我查询该模型时,速度大约慢了10倍.(我正在使用select_related())

在更改之前和之后查看我的Postgres日志提供了原因的线索:

  • 设置之前null=True,生成的SQL是一个带有几个内连接的select语句.
  • 设置之后null=True,生成的SQL会遗漏其中一个连接,而是会出现数千个相同的select语句.

所以这是经典的n + 1查询问题,在解决这个问题之前,如何null=TrueForeignKey不进行性能命中的情况下设置字段?

tri*_*het 1

您可以通过原始查询来解决这个问题。查看在放置之前生成的查询null=True,并通过查询执行它,raw而不是使用“顶级 django ORM”。故障是由于 ORM 不是 Postgres 服务器,因此您可以避免直接运行 SQL 代码生成无用的代码。