Dans MySQL, est-il plus rapide de supprimer puis d'insérer ou est-il plus rapide de mettre à jour les lignes existantes ?

StackOverflow https://stackoverflow.com/questions/4020240

  •  26-09-2019
  •  | 
  •  

Question

Tout d'abord, permettez-moi simplement de dire que j'utilise le framework PHP Yii, j'aimerais donc rester si possible dans son ensemble défini d'instructions SQL.Je sais que je pourrais probablement créer une énorme et longue instruction SQL qui ferait tout, mais je préfère ne pas y aller.

OK, imaginez que j'ai une table Users et une table FavColors.Ensuite, j'ai un formulaire dans lequel les utilisateurs peuvent sélectionner leurs préférences de couleur en cochant une ou plusieurs cases parmi une grande liste de couleurs possibles.

Ces résultats sont stockés sous forme de plusieurs lignes dans la table FavColors comme ceci (id, user_id, color_id).

Imaginez maintenant que l'utilisateur entre et modifie sa préférence de couleur.Dans ce scénario, quel serait le moyen le plus efficace d’introduire les nouvelles préférences de couleurs dans la base de données ?

Option 1:

  • Effectuez une suppression massive de toutes les lignes où correspond user_id
  • Ensuite, effectuez une insertion massive de toutes les nouvelles lignes

Option 2:

  • Parcourez chaque ligne actuelle pour voir ce qui a changé et mettez à jour en conséquence
  • Si plusieurs lignes doivent être insérées, faites-le.
  • Si des lignes doivent être supprimées, faites-le.

J'aime la première option car elle ne nécessite que deux instructions, mais quelque chose ne va pas dans le fait de supprimer une ligne juste pour potentiellement y remettre presque exactement les mêmes données.Il y a aussi le problème de faire en sorte que les identifiants s'auto-incrémentent plus rapidement vers des valeurs plus élevées, et je ne sais pas si cela devrait être évité autant que possible.

L'option 2 nécessitera beaucoup plus de travail de programmation, mais éviterait les situations dans lesquelles je supprimerais une ligne juste pour la recréer.Cependant, ajouter plus de charge dans PHP ne vaut peut-être pas la diminution de charge pour MySQL.

Des pensées?Que feriez-vous tous ?

Était-ce utile?

La solution

UPDATE est de loin beaucoup plus rapide.Lorsque vous UPDATE, les enregistrements de la table sont simplement réécrits avec de nouvelles données.Et tout cela doit être refait sur INSERT.

Lorsque vous DELETE, les index doivent être mis à jour (rappelez-vous que vous supprimez toute la ligne, pas seulement les colonnes que vous devez modifier) ​​et les blocs de données peuvent être déplacés (si vous appuyez sur le bouton PCTFREE limite).Supprimer et ajouter également de nouveaux ID d'enregistrement de modifications sur auto_increment, donc si ces enregistrements ont des relations qui seraient rompues ou nécessiteraient également des mises à jour.j'irais pour UPDATE.

C'est pourquoi tu devrais préférer INSERT ... ON DUPLICATE KEY UPDATE au lieu de REPLACE.

Le premier est un UPDATE opération en cas de violation de clé, tandis que cette dernière est DELETE / INSERT

MISE À JOUR: Voici un exemple INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

Pour plus de détails, lisez la mise à jour Documentation

Autres conseils

Philip, Avez-vous essayé de faire des déclarations préparées? Avec les commandes préparées, vous pouvez lot une requête avec des paramètres différents et l'appeler à plusieurs reprises. A la fin de la boucle, vous pouvez exécuter toutes avec quantité minimale de latence du réseau. Je l'ai utilisé avec des instructions préparées php et il fonctionne très bien. Un peu plus confus que Java déclarations préparées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top