optimisation d'une requete jugée lente

ynk-master
Invité n'ayant pas de compte PHPfrance

19 avr. 2010, 12:06

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;

ViPHP
ViPHP | 4039 Messages

19 avr. 2010, 12:53

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 ?
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ynk-master
Invité n'ayant pas de compte PHPfrance

19 avr. 2010, 13:28

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;
	}

ViPHP
ViPHP | 5462 Messages

19 avr. 2010, 13:32

et ta class dbaccess elle ressemble a quoi ?

ViPHP
ViPHP | 4039 Messages

19 avr. 2010, 14:01

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.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.