[RESOLU] Optimisation requête sql

Eléphant du PHP | 136 Messages

04 avr. 2016, 14:15

Bonjour,


Je dois traiter un certains nombre de résultats provenant de requête sql et d'une base mysql.
Pour l'heure mon script est vraiment très long à s'exécuter, auriez vous une idée pour m'aider à simplifier cette requête et gagner du temps d’exécution ?

Pour l'heure je n'ai pas créé d'index sur mes tables mais je ne sais trop quoi choisir comme index pertinent.
En gros j'ai une table CATEGORIE PRODUIT dont j'extrais un idcategorieproduit. J'ai une table PRODUITS avec idcatproduit et idproduit.
Ensuite une table COMMANDE (avec numerocommande) et COMMANDE CONTENU (avec idcatproduit, idproduit, quantite, total_ttc)

Le but est d'affiché pour chaque catégorie de produit, la liste des produits commandés de cette catégorie à une date donnée.
// 1 J'enregistre mes catégorie produits dans un array : $categorieproduit['idcat']
// 2 je boucle sur mes catégories de produits
foreach ($categorieproduit['idcat'] as $key => $val)
{
	$idcat_boucle=$categorieproduit['idcat'][$key];
	
        // 3 Je recherche les commandes pour un mois et année donnée
	$result_C = mysql_query("select numcommande, datelivraison, statut FROM $MATABLECOMMANDE WHERE (MONTH(datelivraison)='$MOIS' and YEAR(datelivraison)='$ANNEE') order by numcommande");
	while ($r_C = mysql_fetch_array($result_C)) 
	{
               $numcommande= $r_C['numcommande'];
               // 4 je boucle sur le contenu de ces commandes et j'enregistre les produits dans un tableau multidimensionnel
		$result_D = mysql_query("select idproduit,tarif_ttc,idcat,tarif_ht,quantite,idtva,nomproduit,tarif_tva FROM $MATABLECONTENUCMDE WHERE numcommande='$numcommande' and idcat='$idcat_boucle' order by idproduit");
		while ($r_D = mysql_fetch_array($result_D)) 
		{
			$idproduit=$r_D['idproduit'];
			$tarif_ttc=$r_D['tarif_ttc'];
		        $idcat=$r_D['idcat'];
			$CALCUL_tarif_ht=$r_D['tarif_ht'];
			$CALCUL_quantite=$r_D['quantite'];
			$CALCUL_idtva=$r_D['idtva']; 

 			// J'affiche le résultat de cette requête produit
			echo ''.$idcat.' > '.$idproduit.' > '.$tarif_ttc.'';
		}
       }
}
Bisvan :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 avr. 2016, 14:24

Bonjour,

Tu peux déjà mettre des index sur tous tes id et assimilés : numcommande, idcat, idproduit
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 136 Messages

04 avr. 2016, 14:31

Est ce que le fait d'indexer ces données m'obligent à modifier mes requêtes ?
Bisvan :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 avr. 2016, 15:41

Non, il n'y a rien à modifier dans tes requêtes quand tu poses un index.
Le fait de poser un index permet juste à ton serveur de base de données de savoir que tu va probablement faire des recherches ou des tris sur ces champs, il va donc effectuer en quelque sorte un pré-traitement qui permettra d'accélérer ensuite le traitement des requêtes.

Après si ça n'est pas suffisant, tu pourras essayer d'optimiser davantage tes requêtes mais la 1ère des choses à faire c'est déjà des index.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 136 Messages

05 avr. 2016, 08:26

Super cela a changé radicalement le temps d’exécution (de 5mn à 10sec !).
J'ai indexé les idcategorie, idproduit, numcommande.

merci !
Bisvan :)