【发布时间】: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_idfromreviews..... 消除了一些差异 -
这减少了一点时间。我一直在玩,不知何故设法让 phpMyAdmin 返回与 Django 相同的查询时间,尽管这只是意味着它们更慢。根据我运行的
EXPLAIN,看起来bands上的连接是杀手(尽管有索引)。会继续挖掘...