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

use*_*719 5 python django optimization

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

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

Lie*_*yan 7

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

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

一个页面通常最多应该有20-30个查询,这将严重影响性能.大多数页面应该只有5-10个查询.您希望减少查询数量,因为往返是数据库性能的头号杀手.通常,一个大查询比100个小查询快.

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


Jac*_*edd 5

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

  • 不,任何人都会关心它.数据库独立性是ORM抽象的副作用,而不是其目标.将它作为目标绝对没有意义.每个RDMS(甚至SQLite)都有自己的性能/功能细节,可以用来产生巨大的性能提升,简化模型,提高完整性等.关心数据库独立性就是说,"我只想使用一个子集我的数据库权力".ORM可以使简单的事情更简单,而不是使复杂的事情变得不可能. (3认同)
  • @JackShedd:不是我,我一般用sqlite开发并部署到MySQL.我甚至曾经将最初为sqlite和MySQL设计的中型django应用程序部署到Postgre而没有更改任何应用程序代码,并且该应用程序以前从未在Postgre上进行过测试. (2认同)
  • 为什么这很奇怪?数据库独立性是否可行?你和数据库独立之间通常有什么关系? (2认同)