Django - 追踪在数据库中生成慢查询的代码

Posted

技术标签:

【中文标题】Django - 追踪在数据库中生成慢查询的代码【英文标题】:Django - track down the code that generated slow queries in database 【发布时间】:2021-02-01 07:02:51 【问题描述】:

我将 Django 用于大型应用程序。在监控数据库 (Postgres) 时,我有时会看到写入了一些慢查询日志。

问题是如何追踪生成这些查询的代码。理想情况下,我想要这些日志的一些堆栈跟踪,但想知道是否有其他最佳实践,或者其他工具。

它在生产中,所以 DEBUG 设置为 False,所以 Django 本身不跟踪查询的速度。

P.S - 我在某处看到有人建议将 SQL 注释添加到 SQL 查询本身。不幸的是,这在 Django 中似乎并不普遍,而且它还需要我更新生成查询的每一个代码。

【问题讨论】:

你可以看看Django Debug Toolbar。据我所知,不推荐用于生产,但可以使用。 NewRelic APM for Production 很棒 【参考方案1】:

有很多工具可以检查监控在 Django 应用程序中执行的 SQL 查询。

    Django Debug Toolbar

    Django 调试工具栏是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。

    Django Silk

    Django Silk 是 Django 框架的实时分析和检查工具。 Silk 拦截并存储 HTTP 请求和数据库查询,然后将它们呈现在用户界面中以供进一步检查

    Elastic APM

    使用 Elastic APM,监控、检测和诊断复杂的应用程序性能问题,以维持预期的服务水平。

    这更像是一个生产设置,您可以借助开箱即用的功能非常轻松地可视化矩阵。他们确实有一个APM setup section for Django

【讨论】:

以上是关于Django - 追踪在数据库中生成慢查询的代码的主要内容,如果未能解决你的问题,请参考以下文章

Django Query 非常慢

为啥通过 django QuerySet 进行查询比在 Django 中使用游标慢得多?

20MySQL性能慢排查

ForeignKey null=True 时 Django 慢查询

django count(*) 慢查询优化

Mysql中错误日志binlog日志查询日志慢查询日志简单介绍