如何在django应用程序中自动识别n + 1个查询?

时间:2016-01-12 01:17:17

标签: django performance django-models orm select-n-plus-1

是否有任何工具,插件或技术可用于帮助识别Django应用程序上的n + 1个查询? Rails有一个名为bullet的gem,用于识别n + 1个查询和日志,或者以多种方式弹出警告,但我还没有能够找到类似于Django的任何类似内容。如果没有人知道现有的解决方案,我会接受如何编写自己的插件的指导。

3 个答案:

答案 0 :(得分:1)

Scout,一种支持Django应用的APM产品,identifies expensive N+1 queries正在制作中。

以下是如何使用它:

  1. 安装scout-apm Python包(MIT许可证)并提供您的Scout API密钥。 API密钥位于Scout Web UI中。

  2. 部署您的应用,确认Scout正在接收数据,然后在一小时左右回来查看。 Scout分析每个Web请求,检查N + 1,然后在仪表板上显示表现最差的人(screenshot)。

  3. 选择您感兴趣的N + 1,以显示触发N + 1的请求的交易。这包括查询的原始SQL以及触发查询的LOC的回溯(screenshot)。

  4. Scout优于Bullet等开发工具的优势:大多数开发数据库都有少量数据,因此N + 1的真正影响通常是未知的。 Scout只识别那些消耗大量时间的N + 1,这有助于集中精力。

答案 1 :(得分:1)

nplusone执行此操作

  

在Python中自动检测n + 1查询问题

https://github.com/jmcarp/nplusone

带有适当的Django支持!还与烧瓶,香草wsgi,...

集成

答案 2 :(得分:0)

我不知道任何会自动找到并警告你的插件。

我个人使用Django调试工具栏: https://github.com/django-debug-toolbar/django-debug-toolbar

它显示了在页面上运行的查询数,您可以查看它们。