IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Performance ON DUPLICATE KEY


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    275
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 275
    Par défaut Performance ON DUPLICATE KEY
    Bonjour,

    J'ai besoin, sous forme de batch de nuit exécuté 1 à 2 fois par semaine, de créer ou mettre à jour une grande quantité d'information : 1 à 10 millions de lignes.

    j'ai donc pensé à INSERT......ON DUPLICATE KEY ..

    Mais on m'a alerté sur le fait que le ON DUPLICATE KEY est très gourmand.
    Je vous demande donc votre retour d'expérience sur la solution la mieux adapté sachant que j'aurai à priori plus d'UPDATE que d'INSERT lors de chaque mise à jour :

    SOIT : INSERT......ON DUPLICATE KEY .. ?

    SOIT : UPDATE ...
    puis je teste si aucune ligne n'a été mis à jour (mysql_affected_rows() =0) ALORS je fais une INSERT

    D'avance merci

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 889
    Par défaut
    Salut saluts92.

    Que faire si vous devez choisir entre :
    --> (1) faire un insert quand la ligne n'existe pas
    --> (2) faire un update quand la ligne existe déjà

    Il y a le traditionnel test, qui consiste à vérifier en premier l'existence de la ligne.
    Si la ligne n'existe pas faire (1) un insert, sinon faire (2) un update.
    C'est lourd à mettre en place alors que MySql sait le faire mieux que vous.

    La solution consiste à utiliser le replace.
    --> http://dev.mysql.com/doc/refman/5.7/en/replace.html

    Mais comment fonctionne ce replace ?
    Il fonctionne comme un insert, sauf que si la ligne existe déjà, il détruit l'ancienne ligne avant de venir insérer la nouvelle.

    Et quel est la différence avec un on duplicate key ?
    --> http://dev.mysql.com/doc/refman/5.7/...duplicate.html
    Et bien au lieu de détruire l'ancienne ligne, il vient simplement la mettre à jour.

    Donc pour résoudre votre problème, le mieux est de faire le test entre ces deux formes d'écritures afin de comparer avec un jeu d'essai représentatif, la solution qui sera la plus performante.

    @+

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 613
    Billets dans le blog
    10
    Par défaut évitez les i/o inutiles
    Bonjour,

    Le choix de la solution dépend aussi de la fréquence des cas :
    S'il y a de fortes chances que votre ligne existe déjà, il est préférable de tenter l'update en 1er
    Si au contraire, le cas le plus fréquent est l'ajout, alors privilégiez l'insert
    Ceci afin d'éviter les I/O inutiles

    Cela dit, il existe souvent des normes internes à l'entreprise sur ce point, à vous de vérifier ce qu'il en sur le site où vous intervenez.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] erreur 1061 duplicate key name
    Par porco dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/01/2007, 12h52
  2. on duplicate key avec un select au lieu d'update ?
    Par pony dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/10/2006, 15h05
  3. Erreur Duplicate key name
    Par snipes dans le forum Requêtes
    Réponses: 15
    Dernier message: 13/04/2006, 15h55
  4. [SQL SERVER duplicate key]
    Par snetechen dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/01/2006, 10h20
  5. INSERT ... ON DUPLICATE KEY UPDATE
    Par luffy san dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 17/10/2005, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo