2010-11-27 164 views
1

我一直在挣扎着这一段时间。它花费了12秒钟,无法弄清楚为什么,因为所有三张桌子都有长袍,所以它变慢了很多。非常缓慢的Mysql SELECT查询

SELECT SUM(quantity), rprice, media_file, url, title 
FROM inventory, ndxz_objects, ndxz_media 
WHERE productid = ndxz_objects.id 
AND media_ref_id = ndxz_objects.id 
AND productid = media_ref_id 
AND media_order = (SELECT MIN(media_order) FROM ndxz_media WHERE media_ref_id = ndxz_objects.id) 
GROUP BY productid 
ORDER BY productid DESC 

即使世界上ndxz_objects.id我猜你也需要在最低限度,在ndxz_media.media_ref_id索引的索引和productid

+0

什么解释(.. your_query_here ..)说什么?也许将它粘贴在这里,以便我们可以更好地了解性能指标在哪里 – Jaime 2010-11-27 21:50:32

回答

1

放缓是由嵌套查询,因为表扫描需要引起各方media_ref_id = ndxz_objects.id

您需要在media_ref_id并在ndxz_media表media_order

我创建一个索引也建议使用连接重写查询

+0

这些索引帮助了很多0.0022,有趣的是,我尝试了一个索引,但之前没有索引。 – jackjlgregory 2010-11-27 22:18:41

0

。 (我也猜测这就是media_ref_id列的来源,因为你没有非常清楚地确定列名的范围。)

相同的索引可能应该包含media_order作为第二列。

0

这个问题几乎可以肯定是相关的子查询,它每行执行一次,即使索引这样的查询也不是很好。我认为下面应该达到同样的结果。

SELECT SUM(quantity), rprice, media_file, url, title 
FROM inventory, ndxz_objects, ndxz_media, 
(SELECT MIN(media_order) as order FROM ndxz_media GROUP BY media_ref_id) min_orders 
WHERE productid = ndxz_objects.id 
AND media_ref_id = ndxz_objects.id 
AND productid = media_ref_id 
AND media_order = min_orders.order 
GROUP BY productid 
ORDER BY productid DESC 

虽然你提供的查询实际上是无效的,因为反正rprice, media_file, url, title不聚集或group by子句

+0

会在group by子句中包含rprice,media_file,url和title? – jackjlgregory 2010-11-27 22:19:53