我无法弄清楚默认的Django ORM如何处理查询:
Model.objects.filter(foreign__field=value)
是否对每一行进行查找,或者它是否足够智能以使用目标值解析外部字段ID?
或者以这种方式制作会更便宜吗?
value_temp = Foreign.objects.get(field=value)
Model.objects.filter(foreign=value_temp)
答案 0 :(得分:2)
由于Django ORM只是SQL的前端,并且由于SQL性能将非常依赖于数据库和上下文,因此很难概括。我会说,一般来说,除非你非常了解所涉及的性能权衡,否则你不应该费心去尝试解决这种直截了当的方法。 Django和SQL数据库都在努力优化典型的查询模式。
在您引用的具体示例中,第一个调用将在两个表之间执行JOIN
,而第二个调用将生成两个单独的查询,每个查询都是一个表。因此,因素包括:访问数据库的往返时间;是否有外键索引;是否有field
的索引;以及数据库中的特定值。我的猜测是,第一个几乎总是更快,因为数据库是专门为这种查找而定制的。 (你问:它是否对每一行进行查找,或者它是否足够聪明以使用目标值解析外部字段id?答案是,做出该决定的是数据库,而不是Django ;是的,数据库通常采用最有效的路线。)