我有一个使用嵌套ORM查询的遗留代码,它使用JOIN生成SQL SELECT查询,以及包含SELECT和JOIN的条件。执行此查询需要花费大量时间。顺便说一句,当我在原始SQL中执行此查询时,取自Django_ORM_query.query
,它会在合理的时间内执行。
在这种情况下,优化的最佳做法是什么?
如果我使用ManyToMany
和ForeignKey
关系,查询的执行速度会更快吗?
答案 0 :(得分:7)
Django中的性能问题通常是由循环中的以下关系引起的,这会导致多个数据库查询。如果您安装了django-debug-toolbar,则可以检查您正在执行的查询数量,并找出需要优化的查询。调试工具栏还会显示每个查询的时间,这对于优化django至关重要,如果你没有安装它或者没有使用它,你会错过很多。
您通常使用select_related()或prefetch_related()来解决关系问题。
页面通常应该具有大多数 20-30个查询,并且会严重影响性能。大多数页面应该只有5-10个查询。您希望减少查询数量,因为往返是数据库性能的头号杀手。一般来说,一个大查询比100个小查询要快。
数据库性能的第二大杀手是一个非常罕见的问题,尽管它有时会因为减少查询数量的技术而出现。您的查询可能只是太大,如果是这种情况,您应该使用defer()或only(),这样就不会加载您知道不会使用的大字段。
答案 1 :(得分:5)
如有疑问,请使用raw SQL。这是Django世界中完全有效的优化。