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

时间:2013-02-27 21:27:05

标签: python django optimization

我有一个使用嵌套ORM查询的遗留代码,它使用JOIN生成SQL SELECT查询,以及包含SELECT和JOIN的条件。执行此查询需要花费大量时间。顺便说一句,当我在原始SQL中执行此查询时,取自Django_ORM_query.query,它会在合理的时间内执行。

在这种情况下,优化的最佳做法是什么?
如果我使用ManyToManyForeignKey关系,查询的执行速度会更快吗?

2 个答案:

答案 0 :(得分:7)

Django中的性能问题通常是由循环中的以下关系引起的,这会导致多个数据库查询。如果您安装了django-debug-toolbar,则可以检查您正在执行的查询数量,并找出需要优化的查询。调试工具栏还会显示每个查询的时间,这对于优化django至关重要,如果你没有安装它或者没有使用它,你会错过很多。

您通常使用select_related()prefetch_related()来解决关系问题。

页面通常应该具有大多数 20-30个查询,并且会严重影响性能。大多数页面应该只有5-10个查询。您希望减少查询数量,因为往返是数据库性能的头号杀手。一般来说,一个大查询比100个小查询要快。

数据库性能的第二大杀手是一个非常罕见的问题,尽管它有时会因为减少查询数量的技术而出现。您的查询可能只是太大,如果是这种情况,您应该使用defer()或only(),这样就不会加载您知道不会使用的大字段。

答案 1 :(得分:5)

如有疑问,请使用raw SQL。这是Django世界中完全有效的优化。