Django查询性能优化:两种select_related写法哪个耗时更短?
这两种写法的性能完全一致,查询次数和耗时没有任何区别,原因如下:
- Django的QuerySet是惰性求值的:所有
filter、select_related这类方法只是在构建查询逻辑,并不会立刻执行SQL。只有当你实际使用QuerySet(比如遍历、调用first()/all()等)时,才会生成最终的SQL语句并发送给数据库。 - 方法调用顺序不影响最终SQL:不管是先调用
select_related("parent")还是先调用filter(parent=parent_instance),最终生成的SQL都是相同的——通过INNER JOIN关联Parent表,同时过滤出Child表中关联指定parent_instance的记录,只会执行1次数据库查询。
举个实际生成的SQL例子(假设Child外键字段为parent_id,parent_instance的id为1):
SELECT "child"."id", "child"."parent_id", "parent"."id", "parent"."name" -- 示例字段 FROM "child" INNER JOIN "parent" ON ("child"."parent_id" = "parent"."id") WHERE "child"."parent_id" = 1;
所以无需纠结这两种写法的顺序,它们在性能表现上没有差异。
内容的提问来源于stack exchange,提问作者Vitthal Mane
相关产品推荐
相关产品推荐

