2010-11-27 3 views
1

ive борется с этим некоторое время. он занимает более 12 секунд и не может понять, почему, он стал намного медленнее, так как все три стола имеют мантию.Very Slow 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 

Theres индекс на ndxz_objects.id и productid

+0

что это объяснить (.. your_query_here ..) сказать? возможно, вставьте его здесь, чтобы мы могли лучше понять, где работает производительность. – Jaime 2010-11-27 21:50:32

ответ

1

замедление вызвано вложенным запросом, так как сканирование таблицы требуется для каждого media_ref_id = ndxz_objects.id

вам необходимо создать индекс по media_ref_id и media_order в таблице ndxz_media

I также предложите переписать запрос, используя соединения, а не

+0

те проиндексированные помогли много 0.0022, смешно, я попробовал индексы на одном, но не оба раньше. – jackjlgregory 2010-11-27 22:18:41

0

Я предполагаю, что вы также должны, по крайней минимум, индекс на ndxz_media.media_ref_id. (Я также догадываюсь, что именно здесь исходит столбец media_ref_id, так как вы очень четко не указываете имена столбцов.)

Тот же индекс должен, вероятно, включать медиа-блок в качестве второго столбца.

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 не суммируются или в группе по статье

+0

будет включать в себя rprice, media_file, url, title в группе с помощью инструкции clause? – jackjlgregory 2010-11-27 22:19:53