Page 1 sur 1

optimisation d'une requete jugée lente

Posté : 19 avr. 2010, 12:06
par ynk-master
Bonjour,
je cherche un moyen efficace d'optimiser cette requete jugée lente:
$req_privees = " AND RC.NumNant IN (".$serieNum.")";
      }         
                  
      $req = "SELECT RN.NumResion, RC.DateDeb, NomResant, LibResion, DateResion, ConfResion, FactResion , DenoStruc, Tel1Struc "
            ."FROM reservation RN, reservant RT, structure ST, reservcontenant RC "
            ."WHERE RN.NumResant = RT.NumResant AND ConfResion = ".$type." AND RT.NumStruc = ST.NumStruc AND RC.NumResion = RN.NumResion ".$req_privees;

Re: optimisation d'une requete jugée lente

Posté : 19 avr. 2010, 12:53
par Berzemus
Si ça ne pouvait dépendre que de la requête..

Qu'en est-il des index sur la table ? pour chaque champ interrogé dans le where, il devrait y en avoir un. Quel est leur format ? Que dit le EXPLAIN de MySQL ?

Re: optimisation d'une requete jugée lente

Posté : 19 avr. 2010, 13:28
par ynk-master
voici ma foncion complete:
public function listallConf($complement_requete = "", $limite_requete = "",$user=1,$type=0) {
		global $db;
		$req_privees="";
		if($user!=0){
			//$req="SELECT NumNant FROM contenant WHERE CodFam <> 0 and PriveNant = 0 UNION"
						   $req=" SELECT NumNant FROM accescontenant WHERE NumRole = ".$user;//modif yannick
			$reponse = $this->dbaccess->exec_query($req);
			$i=0;
			while($ligne=$this->dbaccess->fetch_row($reponse)){
				$tab[$i]=$ligne[0];
				$i++;
			}
			$serieNum=implode(",",$tab);			
			// Si pas admin, afficher toutes les salle publiques + les privées attribuées au role de l'utilisateur.
			$req_privees = " AND RC.NumNant IN (".$serieNum.")";
		}			 
						
		$req = "SELECT RN.NumResion, RC.DateDeb, NomResant, LibResion, DateResion, ConfResion, FactResion , DenoStruc, Tel1Struc "
				."FROM reservation RN, reservant RT, structure ST, reservcontenant RC "
				."WHERE RN.NumResant = RT.NumResant AND ConfResion = ".$type." AND RT.NumStruc = ST.NumStruc AND RC.NumResion = RN.NumResion ".$req_privees;
				
		if(strlen($complement_requete)!=0)
		{
			$req .= $complement_requete;
		}
		$req .= " GROUP BY RN.NumResion ORDER BY DateResion Desc, RN.NumResion ";
		if(strlen($limite_requete)!=0)
		{
			$req .= $limite_requete;
		}
		//echo $req;
		$result = $this->dbaccess->exec_query($req);
		if ($result == FALSE) {
			echo "Erreur lors de la consultation de la table ".$db.".reservation.";
			return FALSE;
		}
		$i = 0;
		$liste[$i] = $this->dbaccess->fetch_array($result);
		while ($liste[$i] != FALSE) {
			$i++;
			$liste[$i] = $this->dbaccess->fetch_array($result);
		}
		return $liste;
	}

Re: optimisation d'une requete jugée lente

Posté : 19 avr. 2010, 13:32
par stealth35
et ta class dbaccess elle ressemble a quoi ?

Re: optimisation d'une requete jugée lente

Posté : 19 avr. 2010, 14:01
par Berzemus
voici ma foncion complete:
Je ne me souviens pas l'avoir demandé.

Par contre, savoir ce qu'en dit MySQL (avec EXPLAIN) ou savoir si chaque champ utilisé dans ton where est bien indexé...

Si du moins c'est la requête qui est lente (facile à vérifier, suffit de l'entrer dans phpmyadmin) et non ton code qui traine la patte.