Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/08/2007, 00h39   #1
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2004
Messages : 78
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 78
Points : 34
Points : 34
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 :
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 )
ddelec24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 09h55   #2
Membre actif
 
Homme Florian
Chef de projet NTIC
Inscription : novembre 2004
Messages : 205
Détails du profil
Informations personnelles :
Nom : Homme Florian
Âge : 26
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Chef de projet NTIC
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 205
Points : 159
Points : 159
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 :
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.
NaeiKinDus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 10h25   #3
Membre émérite
 
Inscription : avril 2007
Messages : 868
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2007
Messages : 868
Points : 963
Points : 963
Envoyer un message via ICQ à Mark Havel Envoyer un message via MSN à Mark Havel
À 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 .
Mark Havel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 10h59   #4
Membre éprouvé
 
Homme
Développeur informatique
Inscription : janvier 2005
Messages : 349
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 49
Localisation : Belgique

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

Informations forums :
Inscription : janvier 2005
Messages : 349
Points : 439
Points : 439
Salut,
Et pourquoi ne ferais-tu pas une boucle qui garnirait la liste des valeurs à insérer de la manière suivante
Code :
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.
beeboo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2007, 14h33   #5
Nouveau Membre du Club
 
Étudiant
Inscription : juin 2004
Messages : 78
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2004
Messages : 78
Points : 34
Points : 34
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!!!
ddelec24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h38.


 
 
 
 
Partenaires

Hébergement Web