Mysql
 sql >> Base de données >  >> RDS >> Mysql

Un moyen plus rapide de supprimer les lignes correspondantes ?

La suppression de données d'InnoDB est l'opération la plus coûteuse que vous puissiez lui demander. Comme vous l'avez déjà découvert, la requête elle-même n'est pas le problème - la plupart d'entre elles seront de toute façon optimisées pour le même plan d'exécution.

Bien qu'il puisse être difficile de comprendre pourquoi les DELETE de tous les cas sont les plus lents, il existe une explication assez simple. InnoDB est un moteur de stockage transactionnel. Cela signifie que si votre requête était abandonnée à mi-parcours, tous les enregistrements seraient toujours en place comme si rien ne s'était passé. Une fois qu'il est terminé, tout sera parti dans le même instant. Pendant la suppression, les autres clients se connectant au serveur verront les enregistrements jusqu'à ce que votre suppression soit terminée.

Pour y parvenir, InnoDB utilise une technique appelée MVCC (Multi Version Concurrency Control). En gros, il donne à chaque connexion une vue instantanée de l'ensemble de la base de données telle qu'elle était au début de la première instruction de la transaction. Pour ce faire, chaque enregistrement dans InnoDB en interne peut avoir plusieurs valeurs - une pour chaque instantané. C'est aussi pourquoi COUNT sur InnoDB prend un certain temps - cela dépend de l'état de l'instantané que vous voyez à ce moment-là.

Pour votre transaction DELETE, chaque enregistrement identifié en fonction de vos conditions de requête est marqué pour suppression. Comme d'autres clients peuvent accéder aux données en même temps, il ne peut pas les supprimer immédiatement de la table, car ils doivent voir leur instantané respectif pour garantir l'atomicité de la suppression.

Une fois que tous les enregistrements ont été marqués pour suppression, la transaction est validée avec succès. Et même dans ce cas, ils ne peuvent pas être immédiatement supprimés des pages de données réelles, avant que toutes les autres transactions qui fonctionnaient avec une valeur d'instantané avant votre transaction DELETE ne soient également terminées.

Donc, en fait, vos 3 minutes ne sont pas vraiment si lentes, compte tenu du fait que tous les enregistrements doivent être modifiés afin de préparer leur suppression en toute sécurité. Vous "entendrez" probablement votre disque dur fonctionner pendant que l'instruction s'exécute. Cela est dû à l'accès à toutes les lignes. record.Avec la mémoire supplémentaire, InnoDB pourrait être en mesure de lire votre table (principalement) en mémoire et d'éviter un certain temps de recherche de disque.