为什么这个查询这么慢,我该怎么办呢

时间:2015-06-24 09:31:30

标签: mysql

我有来自SELECT

的以下UPDATE 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

问题是,它太慢而且超时,基本上不起作用。

我确信这是与该行:

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

,特别是因为在这个内部选择中有GROUP BYHAVING子句,并且从我读过的内容中可以看出,因为INNER JOINS对于MySQL非常慢。

我的总体目标是:

userID中填充null的{​​{1}}个table_learning 要使用userID中的table_users来执行此操作 在两个表中加入名为ULN的字段 要仅填充ULNtable_users唯一的字段,例如,如果有多个用户拥有此ULN,请填写user_id中的table_learning

1 个答案:

答案 0 :(得分: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)上的综合索引。