2013-07-10 4 views
0

Я получил запрос ниже, вытаскивает данные из нескольких таблиц, чтобы создать обновление:Ускорение MySQL Query inc subquery-join?

UPDATE en_inter.subscribers_data AS sd 
inner join en_inter.list_subscribers AS ls on sd.subscriberid = ls.subscriberid 
LEFT JOIN (
SELECT pd1.email_address,COUNT(pd1.email_address) AS NumDowns 
FROM email.papr_down pd1 
INNER JOIN email.papr_data pd2 on pd1.paper_id = pd2.id 
INNER JOIN email.papr_subj ps on ps.id = pd2.subject 
INNER JOIN email.papr_exam pe on pe.id = pd2.exam 
INNER JOIN email.papr_levl pl on pl.id = pd2.level 
WHERE pd2.exam = 1 
and pd2.level = 4 
GROUP BY email_address 
) AS downs ON downs.email_address = ls.emailaddress 
SET sd.data = ifnull(downs.NumDowns,1) 
WHERE sd.fieldid = 33; 

Он отлично работает, но когда есть много записей в papr_down, то он принимает возрастов, чтобы обработать. Любые идеи о том, как его можно оптимизировать?

+0

http://s22.postimg.org/icqwci2jl/screeny.jpg – JoshGeake

ответ

0

Я думаю, что соединение между emailAddress является проблемой здесь, вы можете попробовать с соединением с Id. Если вы предоставите нам снимок экрана ниже запроса ::

EXPLAIN Select * from 
en_inter.subscribers_data AS sd 
inner join en_inter.list_subscribers AS ls on sd.subscriberid = ls.subscriberid 

LEFT JOIN (
SELECT pd1.email_address,COUNT(pd1.email_address) AS NumDowns 
FROM email.papr_down pd1 
INNER JOIN email.papr_data pd2 on pd1.paper_id = pd2.id 
INNER JOIN email.papr_subj ps on ps.id = pd2.subject 
INNER JOIN email.papr_exam pe on pe.id = pd2.exam 
INNER JOIN email.papr_levl pl on pl.id = pd2.level 
WHERE pd2.exam = 1 
and pd2.level = 4 
GROUP BY email_address 
) AS downs ON downs.email_address = ls.emailaddress 
WHERE sd.fieldid = 33 
+0

Хорошо, вот скриншот - [ссылка] http://s22.postimg.org/icqwci2jl/screeny.jpg [/ link] – JoshGeake

+0

btw да это где соединение по электронной почте, сервер возвращает выбор в <1s – JoshGeake

+0

Ссылка на скриншот недоступна из моей системы, будет лучше, если вы можете вставить скриншот вместе с вопросом –

0

Как я знаю, что мы должны использовать только соединение для столбцов, которые предустановленные в SELECT п и для других объединений мы должны осуществлять с помощью WHERE пункта

Пожалуйста, попробуйте следующий запрос:

UPDATE en_inter.subscribers_data AS sd 
inner join en_inter.list_subscribers AS ls 
on sd.subscriberid = ls.subscriberid 
LEFT JOIN (
SELECT pd1.email_address,COUNT(pd1.email_address) AS NumDowns 
FROM email.papr_down AS pd1 
INNER JOIN email.papr_data AS pd2 on pd1.paper_id = pd2.id 
WHERE 
email.papr_exam.id in (select exam from email.papr_data where exam = 1) 
AND 
email.papr_levl.id in (select level from email.papr_data where level = 4) 
AND 
email.papr_subj.id in (select subject from email.papr_data) 

GROUP BY email_address 
) AS downs ON downs.email_address = ls.emailaddress 
SET sd.data = ifnull(downs.NumDowns,1) 
WHERE sd.fieldid = 33; 

Я не могу выполнить это на моей машине, так как я не имею схемы