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

PHP & Base de données Discussion :

Performances : 3 ou 12000 mysql_query("INSERT..) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Expert confirmé
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Par défaut Performances : 3 ou 12000 mysql_query("INSERT..)
    Bonjour,
    J'ai environ 12000 lignes à insérer dans mysql mais ça peut être un nombre bien plus grand.

    Actuellement, je fais un mysql_query par ligne donc ça fait 12000 mysql_query : ça fonctionne.
    Je voudrais pouvoir améliorer les performances de mon script et essayer de faire moins de mysql_query pour voir si ça influe sur le temps que ça prend ou non. Mon idée est donc de grouper 5000 INSERT dans une variable $bigQuery et de faire un mysql_query quand le groupe est formé. Pour 12000 lignes, ça me ferait plus que 3 mysql_query, MySQL faisant le reste du boulot.

    Pour faire cela, je procède comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $limit=0;
    for($i=0; $i <= count($newCache); $i++)
    {
        // reached the limit or no more entries ?
        if($limit >= $_CONFIG['max_queries'] || $i == count($newCache))
        {
            echo $bigQuery;
            mysql_query($bigQuery) or die("Query not good " . mysql_error());
     
            $bigQuery = NULL;
            $limit=0;
        }
        $bigQuery .= "INSERT INTO backup (path, md5sum, date) VALUES (\"" .
                $newCache[$i]['path'] . "\", \"" .
                $newCache[$i]['md5sum'] . "\", \"" .
                $newCache[$i]['date'] . "\"); ";
        $limit++;
    }
    $_CONFIG['max_queries'] vaut 5000. Si je fais cela, ça me sort
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; INSERT INTO backup (path, md5sum, date) VALUES ("/var/www/153to156.diff", "4d6' at line 1
    En affichant le contenu de $bigQuery, j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO backup (path, md5sum, date) VALUES ("/var/www/.htaccess", "bd429995aaded1ae1001be9d40189e21", "1220709777");
    INSERT INTO backup (path, md5sum, date) VALUES ("/var/www/153to156.diff", "4d6543b8cc73cf650587c8e9ea4e7e5a", "1220709777"); 
    INSERT INTO backup (path, md5sum, date) VALUES ("/var/www/CHANGELOG.php", "2b1df1667f3a17409227c54a0fafb46b", "1220709777");
    ... encore 4997 INSERT ...
    je ne vois pas où est l'erreur. Pire encore, si je mets toutes les requêtes dans un fichier et que je l'importe directement dans mysql : ça marche (logique !). De même si j'importe dans phpmyadmin. J'ai essayé de mettre moins de requêtes d'un coup (seulement 1000) et ça ne fonctionne toujours pas. N'ayant pas accès à la fonction system, je ne peux pas utiliser de fichier sql : tout doit se faire tout seul sans que j'ai à intervenir.

    D'où peut venir le problème ? Si ça n'apporte rien en terme de performances, je resterai avec les 12000 mysql_query


  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 657
    Par défaut
    c'est le ";" qui pose problème, on ne peut pas faire de multi-requêtes
    par contre INSERT a un syntaxe étendue qui pourra te servir
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO backup (path, md5sum, date) VALUES ("/var/www/.htaccess", "bd429995aaded1ae1001be9d40189e21", "1220709777"),
    ("/var/www/153to156.diff", "4d6543b8cc73cf650587c8e9ea4e7e5a", "1220709777"), 
    ("/var/www/CHANGELOG.php", "2b1df1667f3a17409227c54a0fafb46b", "1220709777"),
    ...
    et un ";" tout à la fin

  3. #3
    Expert confirmé
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Par défaut
    ah je connaissais pas la syntaxe étendue
    du coup, ça marche et c'est presque trois fois plus rapide


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

Discussions similaires

  1. [MySQL] pb mysql_query avec insert + php
    Par lecods dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/08/2010, 19h38
  2. Problème insertion Mysql_query
    Par philippe30 dans le forum Installation
    Réponses: 14
    Dernier message: 20/02/2006, 16h21
  3. [MySQL] transformer une simple quote en double pour un insert !!
    Par st0nky dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/01/2006, 16h38
  4. probleme de performance dans l'insertion
    Par chafikha dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/08/2005, 07h59
  5. performance delete/insert vs update
    Par Dionisos dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/08/2005, 18h23

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