Besoin d'aide pour optimatisation
Posté : 19 juin 2009, 02:36
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)
Table resultat_sondage (Contient environ 40 000 données)
Table legende_sondage
Voici le code que j'utilise :
Merci de votre aide!!!!!
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?> %
<?
$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?> %
<?
}
}
?>
Merci de votre aide!!!!!