[RESOLU] requete mysql très lente

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] requete mysql très lente

Re: requete mysql très lente

par moogli » 29 mai 2013, 11:47

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton vert "Mettre le sujet en tant que Résolu" situé en haut de la page à côté du titre du sujet.

Re: requete mysql très lente

par mdcuno » 29 mai 2013, 10:53

Un grand merci pour ta réponse moogli, ça m'a beaucoup aidé, et j'ai réussi à diviser par10 le temps de réponse de la requete en optimisant le code.

Je vais aller plus loin dans les tutoriels du site du zero sur mysql, car je me suis arreté avant les requetes préparées.

A bientôt

Re: requete mysql très lente

par moogli » 28 mai 2013, 17:17

salut,

- Tu récupère trois champs et n'en utilise qu'une seul => vire les deux autres
- Ta requete va faire la même chose autant de fois qu'elle va trouver un code. par exemple si il y a 50 fois le code 512 et 200 fois le code 666 elle va faire 250 update alors que deux seulement sont utile.
- Union : aucun intérêt ici ce qui t’intéresse c'est les code famille, a priori les mêmes dans toutes les tables
- Est ce qu'il y aune table "familles" quelque part histoire d'organiser la jointure entre les tables ?
si oui c'est sur cette table qu'il faut faire un select et pas les autres.
si ce n'est pas le cas il faudrait pour avoir un modèle correct :)

je te conseille aussi les requêtes préparée (qui sotn faite pour ce type de requete dans une boncle) afin d'améliorer les perfs.

tu peux aussi remplacer l'extension mysql (qui est obsolète) par l'extension mysqli, elle t'aidera pour les requêtes préparée

si tu nous indique le modèle de la base (les tables et leurs relations) nous seront plus à même de t'aider à résoudre ton problème :)


@+

requete mysql très lente

par mdcuno » 28 mai 2013, 15:09

Bonjour à toutes et tous

188 secondes pour une requete, c'est long, non?!
J'en conclue que je dois mal faire les choses. Voilà mon problème, j'espère que je vais être suffisamment clair :
J'ai 4 tables qui correspondent à des tables-adhérents. Il faut que j'ajoute une colonne "mot_de_passe" dans chacune d'entre elles, et que j'assigne un mot de passe arbitraire à chaque famille , de chaque table. (un nombre à 4 chiffres, que j'incrémente de 1 à chaque fois) sachant que chaque famille a déjà un code_famille attribué.

Voilà comment j'ai programmé :
$res = mysql_query("	SELECT nom, prenom, code_famille FROM adherents UNION DISTINCT
		SELECT nom, prenom, code_famille FROM adherents_atelier UNION DISTINCT
		SELECT nom, prenom, code_famille FROM adherents_ass_mat UNION DISTINCT
		SELECT nom, prenom, code_famille FROM adherents_activites_familles ORDER BY code_famille"); // Selection des adhérents regroupés par famille
				$mdp = 1000; // initialisation du mot de passe à 1000;
				while ($donnee = mysql_fetch_array($res)){ // on parcourt l'ensemble de tous les codes_famille des 4 tables
					$code_famille = $donnee['code_famille'];
					mysql_query("UPDATE adherents SET mdp = '$mdp' WHERE code_famille = '$code_famille'");
					mysql_query("UPDATE adherents_atelier SET mdp = '$mdp' WHERE code_famille = '$code_famille'");
					mysql_query("UPDATE adherents_ass_mat SET mdp = '$mdp' WHERE code_famille = '$code_famille'");
					mysql_query("UPDATE adherents_activites_familles SET mdp = '$mdp' WHERE code_famille = '$code_famille'");
// mise à jour des tables avec le mot de passe
					
$mdp ++;
				}

Seulement voilà : ce code n'est pas du tout, mais alors pas DU TOUT efficace.
... et comme je débute en php/mysql, je suis certain que vous pourrez m'aider.

Merci à vous