访问ORM对象的属性时设置LIMIT(SQL)

时间:2014-12-19 08:34:04

标签: django django-models django-orm sql-limit

我开始检查执行的SQL查询,以便在Django项目中改进它们(缓存,重新构造它们等)。

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

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

快于:

Company.objects.filter(pk=1)

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

您的外键查找完全相同。 FK指向所有者表的主键;所以数据库再一次需要扫描到第一个不匹配的密钥。