【问题标题】:Django: MySQL queries run really slowly, but are fast when run directly against database (not through Django)Django:MySQL 查询运行速度非常慢,但直接针对数据库运行时速度很快(不是通过 Django)
【发布时间】:2012-06-13 05:49:13
【问题描述】:

我正在构建一个带有一些非常简单的查询的 Django 应用程序。当我在本地运行它时,性能很差:DebugToolbar 报告4119.00 ms (6 queries) 这显然很糟糕。运行时间最长的查询是这个:

Django views.py 代码:

reviews = list(Review.objects.select_related('band', 'record', 'label').order_by('-date_posted')[:12])

输出的 SQL:

SELECT * FROM `reviews` 
INNER JOIN `bands` ON (`reviews`.`band_id` = `bands`.`id`) 
INNER JOIN `records` ON (`reviews`.`record_id` = `records`.`id`) 
INNER JOIN `label` ON (`reviews`.`label_id` = `label`.`id`) 
ORDER BY `reviews`.`date_posted` DESC 
LIMIT 12

现在显然那里有一些连接,但我的表已正确索引。当我在 phpMyAdmin 中运行该查询时,我得到 Query took 0.0241 sec,但在 DebugToolbar 中我看到 1838.00 ms。其他 5 个查询同样缓慢,但直接查询时运行正常。

我在 Windows 上运行 Django 并使用 MySQL(WAMP 服务器)。谁能想到为什么 Django 自己的查询会这么慢?

【问题讨论】:

  • 每行有多少数据?你有很多 BLOBS/TEXT 字段吗?
  • 以下是行数:bands: 2,544, records: 3,363, reviews: 3,516, label: 1,116。 reviews 中有一个 text 字段,就是这样。
  • 您可能想尝试更改您的查询以限制您获得的字段。尝试看看 select reviews.band_id from reviews ..... 消除了一些差异
  • 这减少了一点时间。我一直在玩,不知何故设法让 phpMyAdmin 返回与 Django 相同的查询时间,尽管这只是意味着它们更慢。根据我运行的EXPLAIN,看起来bands 上的连接是杀手(尽管有索引)。会继续挖掘...

标签: mysql django


【解决方案1】:
  1. 确保您使用相同的数据库进行比较。如果一个数据量小,而另一个数据量大,时间就会改变。指出这听起来很愚蠢,但已经犯了更简单的错误。

  2. 在 Django 中,设置DEBUG=False,这样 Django 就不会存储和跟踪查询,这可能会增加开销。我不希望它会像您看到的那样增加,但是您需要使环境逼真。

【讨论】:

  • 是的,绝对是同一个(本地)数据库。尝试设置DEBUG=False,尽管这禁用了DebugToolbar,很难看到数据库响应时间。让我也关闭视图缓存,看看这是否有助于衡量事情......
【解决方案2】:

这个答案真的很晚,但如果其他人正在寻找解决方案,它可能会有所帮助。我在 Windows 上遇到了同样的问题,但是当我禁用缓存时它得到了解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2012-11-05
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多