【发布时间】:2015-02-23 13:51:15
【问题描述】:
我开发了一个 Django 应用程序并通过管理界面添加了一些数据。在这一点上的表现完全糟糕透顶,到目前为止我从来没有遇到过这种情况。
本地(最新版 Macbook pro)和远程(Webfaction 自定义 Django 安装)速度很慢。远程它甚至在通过管理员简单地检索记录时定期丢弃请求。
我是分析新手,但我安装了 Django-Debug-Toolbar。它显示在管理员中检索一条记录需要超过 15000 毫秒,SQL 查询需要 600 毫秒,执行超过 1,100 次查询。远程应用程序不会将服务器内存推到极限(512 的 300 MB,另一个应用程序正在运行)。
看起来不可能需要 1,100 个查询。你同意这是瓶颈吗?它是否完全解释了性能:查询时间为 600 毫秒,总请求时间为 15000 毫秒?
我的项目的一些特点:
- 没什么花哨的,主要是香草 Django 的东西
- 添加了 Django-Rest-Framework 接口
- 具有 52 个表的 Postgres 数据库
- 没有海量数据,最大的表有 10,000 条记录
- 添加更多数据后似乎会变慢。
- 模型之间没有“奇怪”或多余的关系。至少我知道。
除了我刚才提出的问题:我应该寻找什么以及如何解决这个问题?常见错误?
【问题讨论】:
-
是的,查询几乎肯定是罪魁祸首。您已经在使用调试工具栏:它是否显示任何重复或类似的查询?这通常表明事情可以优化。
-
是的,现在正在调查。前几个查询是有意义的,最后几个也是如此。中间的 1000 个查询是具有不同 ID 的重复,似乎根本不需要。不知道为什么我的模型会调用它们。现在深入研究它。
-
曾在模型的
__unicode__方法中查看:如果这些方法正在跨关系查找数据,则可能是罪魁祸首。您可以通过适当地设置 modeladminselect_related属性来解决此问题。 -
但是对于您在页面上显示的每个模型,这都是 2 次查询,所以如果您要显示 100 个模型的列表,那就是 200 个查询,依此类推。再次,select_related 是你的朋友。您可能还对我几年前就这个主题提供的talk 感兴趣。
-
不完全自信,但它可能会给你一些指示。虽然如果这是管理员编辑页面而不是列表页面,那么它可能发生在关系字段的选择框中;在这种情况下,
raw_id_fields会有所帮助。
标签: python django performance