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 :

[SQL] Optimisation pour un grand nombre d'insertions


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juin 2004
    Messages : 88
    Par défaut [SQL] Optimisation pour un grand nombre d'insertions
    bonsoir,

    J'ai remarqué que lorsque je demande un grand nombre de valeurs a insérer (dernier test 153)
    le script met relativement longtemps a s'exécuter ( > 1minute)

    voici la portion de code en question:

    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
    19
    20
    21
     
    // ENREGISTREMENT DES EPISODES
    // ma page appelante a un nombre défini d'input text de la forme titreepXXX par exemple.
     
    for ($i=1; $i=$nbeps; $i++) {
    	$j = $i;
    	if ($j < 10){ 
    		$j = "00" . $j; 
    	} else {
    		if ($j < 100) {
    			$j = "0" . $j; 
    		}
    	}
     
    	$curtitre = $security->protection($_POST['titreep'.$j]);
    	if($utils->is_valid_url($_POST['lienep'.$j])) { $curlien = $_POST['lienep'.$j]; } else { $curlien = '';}
    	if($utils->is_valid_url($_POST['altlienep'.$j])) { $curaltlien = $_POST['altlienep'.$j]; } else { $curaltlien = ''; }
    	$curtaille = $security->protection($_POST['tailleep'.$j]);
     
    	$query = $mysql->query_mysql("INSERT INTO `PA_EPISODE` VALUES ('','$lastidvideo','$curtitre','$curlien','$curaltlien','$curtaille','','0')");
    }
    ma fonction query_mysql ouvre la connexion, exécute la requete puis ferme la connexion a la base de données.
    Je pense que faire 150 connexions a la suite n'est pas le mieux?
    il est préférable d'ouvrir, tout exécuter puis fermer?

    J'ai vu aussi cette fonction http://dev.mysql.com/doc/refman/4.1/...e-queries.html
    est-elle vraiment interessante dans mon cas plutot que les méthodes que jai proposé avant?

    Je recherche toujours a m'améliorer, c'est pour ca que je viens vous demander conseil.
    merci pour votre, réponse, DD.

    (au passage si vous avez a critiquer sur le reste du code n'hésitez pas )

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut !

    La fonction indiquee n'est pas pour le PHP mais pour le C... et php.net ne recense apparement rien de ce genre.

    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
    19
    20
    21
    22
     
    $time1 = microtime(true);
    for ($i = 0; $i < 1500; $i++){
      mysql_connect('host', 'login','pass');
      mysql_select_db('db');
      $result = mysql_query('SELECT COUNT(*) AS \'total\' FROM `table` WHERE `machin` = \'truc\'');
      $finish = mysql_fetch_array($result);
      mysql_close();
    }
    echo "Temps test1 : " . (microtime(true) - $time1) . "\n";
    // Va sortir : Temps test1 : 2.7522418499
     
    $time1 = microtime(true);
    mysql_connect('host', 'login','pass');
    mysql_select_db('db');
    for ($i = 0; $i < 1500; $i++){
      $result = mysql_query('SELECT COUNT(*) AS \'total\' FROM `table` WHERE `machin` = \'truc\'');
      $finish = mysql_fetch_array($result);
    }
    mysql_close();
    echo "Temps test2 : " . (microtime(true) - $time1) . "\n";
    // Va sortir : Temps test2 : 0.557112932205
    Donc oui, tres clairement, il vaut mieux ne faire qu'une seule connexion ^_^ Et sinon, pour aller plus loin, tu peux toujours essayer de modifier ta DB pour ajouter des index & co, mais la c'est en dehors de mes competences.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    868
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 868
    Par défaut
    À mon avis, il faut effectivement ouvrir la connexion à la base en dehors de ta boucle et la refermer en sortant. N'oublie pas d'éteindre la lumière non plus .

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2005
    Messages : 357
    Par défaut
    Salut,
    Et pourquoi ne ferais-tu pas une boucle qui garnirait la liste des valeurs à insérer de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    insert into table(champ1, champ2, champ3, champ4)
    values
    ('val01', 'val02', 'val03', 'val04')
    ('val11', 'val12', 'val13', 'val14')
    ('val21', 'val22', 'val23', 'val24')
    ...
    ...
    ('valn1', 'valn2', 'valn3', 'valn4')
    Donc dans ta boucle tu crées la liste des (val1, val2, val3, val4) que tu boutes-à-boutes (si ! ça existe boute-à-bouter, je viens de l'inventer) dans la variable chaine de ta requête et tu ne passes alors qu'une seule requête SQL.

    Tu remarqueras, si tu utilises PhpMyAdmin que c'est cette méthode qui est utilisée pour copier une table ou une db.

  5. #5
    Membre confirmé
    Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juin 2004
    Messages : 88
    Par défaut
    Ah intéressant j'avais pas vu qu'on pouvait faire comme cela VALUE (..), (..);

    J'ai mis ce système en place c'est plus rapide effectivement

    merci pour vos réponses!!!

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

Discussions similaires

  1. Insertion d'un grand nombre de Insert
    Par Keldou dans le forum SQL
    Réponses: 7
    Dernier message: 08/05/2008, 10h00
  2. [MySQL] INSERT ou UPDATE pour un grand nombre d'enregistrements
    Par Phil.Antrope dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/12/2007, 17h24
  3. Macro Solver pour un grand nombre de ligne
    Par hochimi dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/07/2007, 23h20
  4. Réponses: 7
    Dernier message: 10/05/2007, 16h24
  5. grand nombre d'insert
    Par whilecoyote dans le forum Oracle
    Réponses: 11
    Dernier message: 20/07/2005, 13h02

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