优化Django:嵌套查询 vs 关系查找

5 投票
2 回答
2101 浏览
提问于 2025-04-17 17:22

我有一段老旧的代码,它使用了嵌套的ORM查询,这样会生成一个包含JOIN的SQL SELECT查询,并且条件中也包含了SELECT和JOIN。这种查询执行起来非常耗时。不过,当我直接用原始SQL执行这个查询,取自Django_ORM_query.query,它的执行速度就正常多了。

在这种情况下,有什么优化的最佳实践吗?
如果我使用ManyToManyForeignKey关系,查询会更快吗?

2 个回答

5

如果不确定的时候,可以使用原生 SQL。这在Django的世界里是一个完全有效的优化方法。

9

在Django中,性能问题通常是因为在循环中访问了多个关系,这样会导致多次查询数据库。如果你安装了django-debug-toolbar,你可以查看自己进行了多少次查询,并找出哪些查询需要优化。这个调试工具还会显示每个查询的耗时,这对优化Django非常重要。如果你没有安装或者没有使用它,那你就错过了很多有用的信息。

一般来说,解决关系查询问题的方法是使用select_related()prefetch_related()

一个页面通常最多应该有20到30个查询,超过这个数量会严重影响性能。大多数页面应该只有5到10个查询。你需要减少查询的数量,因为往返查询是数据库性能的头号杀手。一般来说,一个大查询比100个小查询要快。

数据库性能的第二大杀手虽然比较少见,但有时会因为一些减少查询数量的技术而出现。你的查询可能会太大,如果是这种情况,你应该使用defer()或only(),这样就不会加载那些你知道不会用到的大字段。

撰写回答