2015-01-13 3 views
0

удалить около 90k записей из таблицы содержат 100k записи Я творю:Как оптимизировать удаление из select с предложением 'in' в mysql?

delete from table1 where id in (select id from table2) ; 

занимает около 30 минут, если я построить такую ​​же dynamiclly в каком-то программирует языке это запустить менее чем за минуту.

for i in (records to delete) 
     delete from table1 where id = i 

Как оптимизировать собственный запрос mysql?

+0

Сколько записей в таблице2? 'id (тонны и тонны и тонны ids)' будет медленным, независимо от того, что вы делаете. –

ответ

1

Я предлагаю вам использовать операцию соединения вместо IN (subquery), и убедитесь, что соответствующий индекс (с id в качестве ведущей колонки) доступна на table1 :

DELETE t1.* 
    FROM table1 t1 
    JOIN table2 t2 
    ON t2.id = t1.id 

EDIT

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

Этот ответ более краток, чем большинство моих ответов; Полагаю, я мог бы объяснить, почему подходящий индекс необходим для хорошей работы.

Вопрос OP заключался в том, как «оптимизировать удаление», которое использовало предикат col IN (subquery). Я признаю, что я не представил объяснения по поводу , почему этот шаблон может привести к субоптимальной производительности; и почему операция соединения иногда может быть более эффективной. OP спросил «как оптимизировать собственный SQL-запрос» ... Короткий ответ заключается в повторной записи запроса.

0

Mysql плохо с IN подзапросов, использование существует

delete from table1 where exists (select 1 from table2 WHERE table1.id=table2.id) ; 
0

Попробуйте это:

DELETE 
    table1.* 
FROM 
    table1, table2 
WHERE 
    table1.id = table2.id 

или использовать JOIN. Избегайте IN, если это вообще возможно.

+3

Ваш пример - неявный 'JOIN', который устарел с 1992 года. Http://en.wikipedia.org/wiki/Join_%28SQL%29 –

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