Eu herdei um banco de dados e estou procurando limpá-lo e acelerá-lo. Eu tenho uma tabela que contém 30.000.000 linhas, muitas das quais são dados indesejados inseridos devido a um erro em nome do nosso programador. Antes de adicionar índices novos e mais otimizados, converti a tabela do MyISAM para o InnoDB e pretendo excluir muitas das linhas que contêm dados indesejados.
O banco de dados é MySQL 5.0 e eu tenho acesso root ao servidor. Eu estava executando esses comandos primeiro pelo Adminer e depois pelo phpMyAdmin, ambos com os mesmos resultados.
O comando que estou executando é,
DELETE
FROM `tablename`
WHERE `columnname` LIKE '-%'
Essencialmente, exclua tudo nesta coluna que comece com um traço -
.
Ele dura cerca de 3-5 minutos e, quando vejo a lista de processos, desaparece.
Então eu corro,
SELECT *
FROM `tablename`
WHERE `columnname` LIKE '-%'
e retorna milhões de linhas.
Por que minha declaração de exclusão não está sendo concluída?
PS, estou ciente de como o MySQL 5.0 está desatualizado. Estou trabalhando para mover o banco de dados para o MySQL 5.6 w InnoDB (talvez MariaDB 10 w XtraDB), mas até que isso aconteça, estou procurando responder isso com o banco de dados como está.
-
Editar removido, veja minha resposta.
WHERE
.LIMIT
inferior; dizem 10000.)A solução mais fácil é simplesmente não fazer isso - faça uma exclusão menor, que pode ser processada com mais facilidade.
Nesse caso, eu recomendaria tentar exclusões seqüenciais do formulário:
fonte
Talvez você possa fazer algo assim:
deleted
.UPDATE tablename SET deleted=1 WHERE `columnname` LIKE '-a%'
.cron
para excluir isso durante a noite.fonte