5

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

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

4

2 回答 2

8

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

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

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

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

于 2013-02-27T22:21:06.897 回答
5

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

于 2013-02-27T21:29:53.313 回答