我开始检查执行的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的信息而执行的查询将不具有任何类型的限制,因此将遍历整个表以查找尽可能多的记录。如何设置限制以使其不这样做?
答案 0 :(得分:0)
你的“优化”并不明显,我会非常怀疑它甚至是一种优化。
数据库在优化查询时通常非常好,尤其是在这样的简单情况下。如果通过主键向数据库请求记录,则不会扫描整个数据库:而是使用该列的索引。该指数是有序的;因此,一旦数据库遇到不匹配的记录,它将立即停止扫描。绝对没有必要限制该查询。
您的外键查找完全相同。 FK指向所有者表的主键;所以数据库再一次需要扫描到第一个不匹配的密钥。