1
votes

Comment supprimer 200k données avec un ID utilisateur spécifique?

Je suis actuellement un débutant sur Mysql et on m'a confié la tâche de supprimer plus de 200 000 données via phpmyadmin.

En fait, j'ai parcouru toutes les données et en ai extrait les identifiants utilisateur, juste pour savoir que cela ne fonctionne pas comme je le pensais. En utilisant ce code:

DELETE FROM User_data 

WHERE user_id IN ( 18852,22233,31257888,234414,555551....88884442);

Je m'attendais à ce qu'il supprime toutes les 200 000 données à la fois, mais il n'a supprimé que 5 000 données à la place.

Merci d'avoir lu cette! J'espère avoir quelques réponses

Modifié: les User_ids ne sont pas ordonnés correctement


2 commentaires

Alors, êtes-vous en train de dire que l'instruction de suppression s'est terminée, mais n'a supprimé que les enregistrements 5K, ou qu'elle n'a pas du tout fini?


Salut Tim, cela s'est terminé mais seulement 5k enregistrements ont été supprimés


3 Réponses :


0
votes

C'est votre clause IN qui a une limite, vérifiez le max_allowed_packet

vous pouvez effectuer cette requête à la place.

delete from User_data where user_id between 18852 and 18853
or user_id between 22233 and 22238
or user_id between 555551 and 555553

ou

delete from User_data where user_ID order by id desc limit 200000


0 commentaires

0
votes

Vous pouvez essayer ceci

DELETE FROM User_data WHERE user_ID LIMIT 200000; 


0 commentaires

1
votes

Vous pouvez essayer de remplir une table temporaire contenant les valeurs user_id à supprimer, puis effectuer une jointure de suppression:

CREATE TEMPORARY TABLE user_ids (user_id INT PRIMARY KEY);
INSERT INTO user_ids (user_id)
VALUES
    (18852), (22233), (31257888), (234414), (555551), ..., (88884442);
-- or maybe load from CSV using LOAD DATA

DELETE u1
FROM User_data u1
INNER JOIN user_ids u2
    ON u1.user_id = u2.user_id;

Maintenant, parce que le La colonne user_id de la table temporaire est une clé primaire, la recherche de jointure doit être très rapide (probablement un peu plus rapide que votre WHERE IN actuel). En outre, cela résout le problème d'essayer de passer trop de paramètres IN dans la requête. Avec cette solution, vous n'avez pas du tout à faire cela.


1 commentaires

Merci beaucoup Tim, cela fonctionne comme un charme. Au lieu d'utiliser une table temporaire, j'ai créé une table et y ai chargé des données car il y en a trop à taper.