2015-06-24 224 views
0

我從MySQL爲什麼該查詢這麼慢,我可以做些什麼

UPDATE table_Learning l 
INNER JOIN (select ULN, id from table_users group by ULN having count(ULN) =1) u 
ON l.ULN = u.ULN 
set l.user_id=u.id 
WHERE l.user_id is null 

的問題是以下SELECTUPDATE聲明,它是如此緩慢,超時,基本上不起作用。

我相信這是與線做:

INNER JOIN (select ULN, id from table_users group by ULN having count(ULN) =1) u 

,特別是因爲同時存在一個GROUP BYHAVING子句中的這種內在的選擇,從我已閱讀,因爲INNER JOINS很與MySQL緩慢。

我的總體目標是:

填充userID的是,在table_learningnull爲此使用userID的在table_users 加入這兩個表 名爲ULN去外地只填充ULNtable_users中是唯一的字段,例如,如果不止一個用戶擁有此ULN,則不要填充user_idtable_learning

+0

這些innodb表嗎? – EternalHour

+0

@EternalHour是的,他們是 – Alex

+0

在這種情況下,問題是'HAVING COUNT'。使用innodb時,數據不會像myisam那樣編入索引,從而導致表掃描。請提供您的查詢的'EXPLAIN'。 – EternalHour

回答

2

這是您的查詢:

UPDATE table_Learning l INNER JOIN 
     (select ULN, id 
     from table_users 
     group by ULN 
     having count(ULN) = 1 
     ) u 
     ON l.ULN = u.ULN 
    set l.user_id=u.id 
    WHERE l.user_id is null; 

在MySQL中,子查詢將是昂貴的。 table_learning(user_id)上的索引可能會有所幫助。但是,在子查詢中進行篩選也有助於:

UPDATE table_Learning l INNER JOIN 
     (select ULN, id 
     from table_users 
     where exists (select 1 
         from table_learning tl 
         where tl.ULN = u.uln and tl.user_id is null 
        ) 
     group by ULN 
     having count(ULN) = 1 
     ) u 
     ON l.ULN = u.ULN 
    set l.user_id=u.id 
    WHERE l.user_id is null; 

爲此,您需要table_learning(ULN, user_id)上的複合索引。