2013-07-10 49 views
0

我有低于查询的从多个表中提取数据创建一个更新:加速MySQL Query inc子查询连接?

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; 

我不能在我的计算机上执行此,因为我没有架构