No MySQL 5.6 eu tenho cerca de 60 milhões de linhas. Eu queria remover linhas com base no ID. Aqui Id é a chave primária.
Um comportamento estranho que tive hoje.
delete from tbl where id=1;
É executado em milissegundos.
Então eu fiz isso.
CREATE TEMPORARY TABLE DELETE_ID (ID int);
Insert into DELETE_ID select id from (subery1(subquery2(subquery3)));
O DELETE_ID tem cerca de 150 IDs.
Delete from tbl where id in (select id from DELETE_ID);
Está demorando mais de 30 minutos, mas excluindo uma única linha.
Não houve bloqueios ou impasses.
Em innodb_trx o status às vezes era às fetching rows
vezes unlocking rows
.
Alguém pode me ajudar a entender porque isso está acontecendo?
WHERE .. IN
é lento na maioria dos casos.Use a exclusão de várias tabelas :
Excluir de tbl onde EXISTS (SELECT id FROM DELETE_ID WHERE tbl.id = DELETE_ID.id);