0

我开始审查执行的 SQL 查询,以便在我的 Django 项目中改进它们(缓存、重新格式化它们等)。

例如,要从数据库中获取单个对象,请执行以下操作:

Company.objects.filter(pk=1)[:1]

比:

Company.objects.filter(pk=1)

因为在前者中,我们限制了查找的数量。这很明显,但不太明显的是在访问恰好是 ForeignKey 的模型的属性时如何设置限制。例如,如果CompanyModel是一个有OneToOneFieldto Company 的模型,我们尝试从主模型访问一些属性:

test = Company.objects.filter(pk=1)[:1]
profile = test.CompanyProfile.owner

为获取有关 CompanyProfile 的信息而执行的查询将没有任何限制,因此将遍历整个表以查找尽可能多的记录。如何设置限制以使其不这样做?

4

1 回答 1

0

您的“优化”并不明显,我会非常怀疑它甚至是优化。

数据库通常非常擅长优化它们的查询,尤其是在像这样的简单情况下。如果您通过其主键向数据库询问记录,它不会扫描整个数据库:相反,它使用该列的索引。该索引是有序的;因此,一旦数据库遇到不匹配的记录,它将立即停止扫描。绝对没有必要限制该查询。

您的外键查找也是如此。FK指向owner表的主键;所以再一次,数据库只需要扫描到第一个不匹配的键。

于 2014-12-19T09:52:16.293 回答