Page 1 sur 1

Besoin d'aide pour optimatisation

Posté : 19 juin 2009, 02:36
par emmash
Allo à tous,

J'ai un gros problème de lenteur pour mes requêtes SQL, j'ai beaucoup de données à traiter et pour l'instant, le code que vous trouverez plus bas prend 15-20 secondes à s'afficher... inacceptable! Je n'ai seulement que 20 municipalités à afficher donc j'ai beaucoup de misère à cerner le problème...j'ai remarqué que sans la requête requete_repondants_code_legende, ça prend environ 3-4 secondes à s'afficher...S.v.p. aidez-moi!!! Je ne sais vraiment plus quoi faire pour optimiser le tout!!

Nous effectuons différents sondages auprès des consommateurs. Lorsque l'un d'eux répond, le résultat est ajouté dans la table resultat_sondage avec sa réponse (ex : 2 : Faire l'épicerie), le numéro de ce consommateur ainsi que le numéro du sondage.

À chaque sondage, une légende est associée du type :
no_code_legende : 1
description_legende : Lire un livre
no_code_legende : 2
description_legende : Faire l'épicerie


En résumé, je désire afficher, pour un sondage donné, les résultats classés par ville :
- le nom de la ville
- le nombre de personnes qui ont répondues pour cette ville (% de répondants)
- le pourcentage pour chaque choix du sondage (Par exemple : 25 % pour le choix Faire L'épicerie)


Voici la structure des tables que j'utilise dans ma base de données :

Table consommateur (Contient environ 80 000 données)

Code : Tout sélectionner

CREATE TABLE `consommateur` ( `identifiant_consommateur` varchar(10) NOT NULL default '', `ville_consommateur` varchar(100) NOT NULL default '', PRIMARY KEY (`identifiant_consommateur`), KEY `index_ville_consommateur` (`ville_consommateur`), ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Table resultat_sondage (Contient environ 40 000 données)

Code : Tout sélectionner

CREATE TABLE `resultat_sondage` ( `no_resultat_sondage` int(11) NOT NULL auto_increment, `identifiant_consommateur` int(11) NOT NULL default '0', `telephone_consommateur` varchar(20) NOT NULL default '', `reponse1` longtext NOT NULL, `no_sondage` int(11) NOT NULL default '0', PRIMARY KEY (`no_resultat_sondage`), KEY `index_identifiant_consommateur` (`identifiant_consommateur`), KEY `no_sondage` (`no_sondage`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=95498 ;

Table legende_sondage

Code : Tout sélectionner

CREATE TABLE `legende_sondage` ( `no_legende` int(11) NOT NULL auto_increment, `no_code_legende` char(3) NOT NULL default '', `description_code_legende` longtext NOT NULL, `no_sondage` int(11) NOT NULL default '0', PRIMARY KEY (`no_legende`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;

Voici le code que j'utilise :
<?
$requete_liste_villes=mysql_query("SELECT ville_consommateur FROM consommateur GROUP BY ville_consommateur") or die(mysql_error());
	while($ligne_liste_villes=mysql_fetch_assoc($requete_liste_villes)){
	$requete_residents_ville=mysql_query("SELECT identifiant_consommateur FROM consommateur WHERE ville_consommateur='".$ligne_liste_villes["ville_consommateur"]."'") or die(mysql_error());
	$int_total_residents=mysql_num_rows($requete_residents_ville);
	$requete_repondants_ville=mysql_query("SELECT resultat_sondage.identifiant_consommateur FROM resultat_sondage INNER JOIN consommateur ON consommateur.identifiant_consommateur=resultat_sondage.identifiant_consommateur WHERE reponse1<>'' AND no_sondage='".$_GET["no_sondage"]."' AND ville_consommateur='".$ligne_liste_villes["ville_consommateur"]."'") or die(mysql_error());
	$int_total_repondants=mysql_num_rows($requete_repondants_ville);
	$int_pourcentage_repondants_ville=number_format(($int_total_repondants/$int_total_residents)*100, 0, ',', ',');
	?>
  	<?=stripslashes($ligne_liste_villes["ville_consommateur"])?>
    <?=$int_pourcentage_repondants_ville?>&nbsp;%
    <?
	$requete_legende_sondage=mysql_query("SELECT no_code_legende, description_code_legende FROM legende_sondage WHERE no_sondage='".$_GET["no_sondage"]."' ORDER BY no_code_legende") or die(mysql_error());
		while($ligne_legende_sondage=mysql_fetch_assoc($requete_legende_sondage)){					
		$requete_repondants_code_legende=mysql_query("SELECT resultat_sondage.identifiant_consommateur FROM resultat_sondage INNER JOIN consommateur ON consommateur.identifiant_consommateur=resultat_sondage.identifiant_consommateur WHERE SUBSTRING(reponse1, 1, 1)='".$ligne_legende_sondage["no_code_legende"]."' AND no_sondage='".$_GET["no_sondage"]."' AND ville_consommateur='".$ligne_liste_villes["ville_consommateur"]."'") or die(mysql_error());
		$int_total_repondants_code_legende=number_format((mysql_num_rows($requete_repondants_code_legende)/$int_total_repondants)*100, 0, ',', ',');
		?>
    	<?=stripslashes($ligne_legende_sondage["description_code_legende"])?>
		<?=$int_total_repondants_code_legende?>&nbsp;%
    	<?
		}
	}
	?>

Merci de votre aide!!!!!

Posté : 19 juin 2009, 03:02
par AB
M'est avis que tu va avoir quelques nouvelles des modos.

Sinon tu as compté combien tu faisais faire de requêtes dans tes boucles ?

Posté : 19 juin 2009, 08:56
par zeus
Modération :
emmash, le multipostage est interdit sur le forum.

De plus, tes délais ne nous intéressent pas.
Nous savons que tu es en difficulté puisque tu demandes de l'aide,
mais nous sommes tous bénévoles et répondons selon nos disponibilités.
Merci de ne pas s'impatienter.

Comme tu es partie sur de mauvaises bases, je te conseille vivement la lecture des règlements.