J'ai hérité d'une base de données et cherche à la nettoyer et à l'accélérer. J'ai une table qui contient 30 000 000 lignes, dont beaucoup sont des données indésirables insérées en raison d'une erreur de la part de notre programmeur. Avant d'ajouter de nouveaux index plus optimisés, j'ai converti la table de MyISAM en InnoDB et je cherche à supprimer un grand nombre de lignes contenant des données indésirables.
La base de données est MySQL 5.0 et j'ai un accès root au serveur. J'ai d'abord exécuté ces commandes via Adminer, puis phpMyAdmin, les deux avec les mêmes résultats.
La commande que j'exécute est,
DELETE
FROM `tablename`
WHERE `columnname` LIKE '-%'
Essentiellement, supprimez tout élément de cette colonne qui commence par un tiret -
.
Cela dure environ 3 à 5 minutes, puis lorsque je consulte la liste des processus, elle disparaît.
Je cours alors,
SELECT *
FROM `tablename`
WHERE `columnname` LIKE '-%'
et il renvoie des millions de lignes.
Pourquoi ma déclaration de suppression ne se termine-t-elle pas?
PS, je sais à quel point MySQL 5.0 est obsolète. Je travaille sur le déplacement de la base de données vers MySQL 5.6 w InnoDB (peut-être MariaDB 10 w XtraDB) mais jusqu'à ce que cela se produise, je cherche à répondre à cela avec la base de données telle quelle.
-
Modifier supprimé, voir ma réponse.
WHERE
.LIMIT
plus bas; disons 10000.)La solution la plus simple consiste simplement à ne pas le faire - effectuez une suppression plus petite, qui peut être traitée plus facilement.
Dans ce cas, j'aurais recommandé d'essayer les suppressions séquentielles du formulaire:
la source
Vous pourriez peut-être faire quelque chose comme ça:
deleted
.UPDATE tablename SET deleted=1 WHERE `columnname` LIKE '-a%'
.cron
pour le supprimer la nuit.la source