Mysql :requete lourde comment alleger...

Nouveau WRInaute
Bonjour,

J'ai un site avec une génération de sitemap basé sur l'interprétation de ma base de données. Jusqu'a aujourd'hui je listais mes fiches techniques en parcourant la table ou sont stocké les noms des bateaux (avec une boucle while). J'ai rajouté la possibilité de comparer 2 bateaux et j'aimerais bien integrer ces comparatifs au sitemap le problème c'est que la requète devient lourde (double boucle while).

Première solution => pendant mon listing de fiches je fait un "dictionnaire" du genre marque[bateau1] = nomdelamarque, comme ça plus besoin d'ouvrir la BDD pendant la "double boucle".

ça marche pour l'instant mais avec plus de bateaux j'ai peur que ça coince... comment reduire la charge du serveur (effacer le resultat des requetes? faire en plusieures étapes?...).

Merci d'avance

Clément
 
Nouveau WRInaute
Dans un premier temp je liste le fiches techniques et je créé les dictionnaires de marque et de modèle a chaque fois avec des boucles sur les resultats des requetes

Code:
//On liste les marques
$reqmarque = mysql_query("SELECT * FROM $tablemarque order by id ASC") or die ("erreur requete zz");
while( $marque = mysql_fetch_array ($reqmarque)){
	$idmarque = $marque["id"];
	$tmarque[$idmarque] = $marque[$lang];
}

//On liste les voiliers
$reqgenre = mysql_query("SELECT id,marque,dernieremod,modele,genre,type FROM $tablebateau order by id ASC") or die ("erreur requete zz");
while( $genre = mysql_fetch_array ($reqgenre)){
	$idmodele = $genre["id"];
	$idmarque = $genre["marque"];
	$lastmod = str_replace("/","",$genre["dernieremod"]);
	$derniermod[$idmodele] = $lastmod;
	$genremod[$idmodele] = $genre["modele"];
	$marquemod[$idmodele] = $genre["marque"];
	$argref = carspec($tmarque[$idmarque].$genre["modele"]);
	$ttext = $ttext.'<url><loc>'.$url.'voiliers-'.$lang.'/'.$idmodele.'-'.$argref.'.html</loc><lastmod>'.$lastmod.'</lastmod></url>';
	if(datetrans($lastmod) > datetrans($lastmodmarque[$idmarque])){$lastmodmarque[$idmarque] = $lastmod;}else{}
	$idtemp = $genre["type"];
	if(datetrans($lastmod) > datetrans($lastmodtype[$idtemp])){$lastmodtype[$idtemp] = $lastmod;}else{}
	$idtemp = $genre["genre"];
	if(datetrans($lastmod) > datetrans($lastmodgenre[$idtemp])){$lastmodgenre[$idtemp] = $lastmod;}else{}
	if(datetrans($lastmod) > datetrans($lastmodmax)){$lastmodmax = $lastmod;}else{}
}

Ensuite dans un second temp je fais une boucle sur le dictionnaire et une seconde a l'intérieur encore une fois sur le dictionnaire.

Code:
$reqgenre = mysql_query("SELECT id FROM $tablebateau order by id DESC LIMIT 0,1") or die ("erreur requete zz");
$genre = mysql_fetch_array ($reqgenre);
$derniermodele = $genre["id"];
//On liste les comparatifs
for($idmodele=1000; $idmodele != $derniermodele ; $idmodele++){
	for($idmodele2=$idmodele; $idmodele2 != $derniermodele ; $idmodele2++){
		$idmarque = $marquemod[$idmodele];
		$idmarque2 = $marquemod[$idmodele2];
		$lastmod = $derniermod[$idmodele];
		$lastmod2 = $derniermod[$idmodele2];
		if($lastmod2 > $lastmod){$lastmod = $lastmod2;}else{}
		$argref= carspec($tmarque[$idmarque].$genremod[$idmodele].'vs'.$tmarque[$idmarque2].$genremod[$idmodele2]);
		$ttext = $ttext.'<url><loc>'.$url.'voiliers-'.$lang.'/'.$idmodele.'-'.$idmodele2.'-'.$argref.'.html</loc><lastmod>'.$lastmod.'</lastmod></url>';
	}
}

Pour la structure ici j'utilise deux tables marque et modele. Dans modele je stock quasiement tous et marque je stocke le nom suivant la langue.
 
Discussions similaires
Haut