2015-06-24 4 views
0

У меня есть следующие SELECTUPDATE заявление 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 BY и пункт HAVING в этот внутренний выбор, и от того, что я прочитал, потому что INNER JOINS очень медленный с MySQL.

Моя общая цель состоит в том, чтобы:

заселить userID «S, которые null в table_learning Чтобы сделать это, используя userID» S в table_users Чтобы присоединиться на поле с именем ULN в обеих таблицах Чтобы только заполнить поля, где ULN является уникальным в table_users, например, если более чем один пользователь имеет эту ULN, то не заполнять user_id в table_learning

+0

Это эти презервативы? – EternalHour

+0

@EternalHour да, они – Alex

+0

В этом случае проблема заключается в 'HAVING COUNT'. С innodb данные не индексируются, как с myisam, которые могут вызвать сканирование таблицы. Предоставьте «ОБЪЯСНЕНИЕ» вашего запроса. – 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).

Смежные вопросы