IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimisation requete SQL/php


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Optimisation requete SQL/php
    Hello,

    je me trouve face a un problème:

    j'ai une requête SQL qui fonctionne très bien (elle m'affiche ce que je veux voir) mais qui a un temps de traitement relativement long.

    Page générée en 28.6133s avec 7 requêtes
    je me demandais donc si il été possible d'optimiser la requête et/ou sont traitement php.

    voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    if(isSet($_POST['locID'])){
      $locID = $_POST['locID'];
     
       echo $locID;
     
        if ($locID == 0){
    		$loc="item.ownerid = 1234567890";
    	}
    	else{
    	$loc="item.locationID='$locID' and item.ownerid = 1234567890";
    	}
    $request =("select *, object.typeName as Name, flag.flagText as Flagtext, 
    						station.stationName as Stationname ,
    						item.locationID,
    						item.typeid,
    						item.quantity,
    						item.ownerid,
    						division.description
    			from  (SELECT item.quantity, item.ownerid, item.typeid, loc.itemid, item.flag, loc.locationid from eveapi.corpassetlist as item
    			inner join eveapi.corpassetlist as loc on loc.lft < item.lft and loc.rgt > item.rgt
    			and loc.ownerid = 1234567890) item
    			inner join evedump.invtypes as object on item.typeid = object.typeid
                            inner join evedump.invflags as flag on item.flag = flag.flagID
    			left outer join eveapi.corpdivisions as division on flag.flagID = division.accountKey - 885 and division.ownerID=1234567890
    			left outer join evedump.stastations as station on item.locationID = station.stationID + 6000001
    		        WHERE 
    			$loc
    			;");

    et son traitement pour affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while ($row = mysql_fetch_array($result)) {
    echo'
    <tr>
    <td class="stockback" width="30">'.$row['typeID'].'</td>
    			<td class="stockback">'.$row['Name'].'</td>
    			<td class="stock'.$color.'" width="50">'.$row['quantity'].'</td>
    			<td class="stock'.$color.'" width="50">'.$cmdqty.'</td>
    			<td class="stockv'.$vcolor.'" width="50">'.$virtual.'</td>
    			<td class="stockback" width="320">'.$row['stationName'].'</td>
    			<td class="stockback" width="250">'.$row['description'].'</td>
    			<td class="stockback" width="250">'.$row['Flagtext'].'</td>
    			</tr>
    			';
    		}
    quelques variables dans le traitement sont visible mais ne sont pas utile a l'optimisation de la requête (comme $virtual qui est un nombre qui n'a rien a voir)

    Je ne sais pas si c'est un problème de requête ou de traitement d'affichage et je ne sais pas non plus si c'est optimisable.

    Merci pour votre aide

  2. #2
    Membre actif
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Points : 215
    Points
    215
    Par défaut
    Rien qu'à première vue, une question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select *, object.typeName as Name, flag.flagText as Flagtext, 
    						station.stationName as Stationname ,
    						item.locationID,
    						item.typeid,
    						item.quantity,
    						item.ownerid,
    						division.description
    Tu fais un select * , puis tu listes certains champs..
    Soit tu veux tout et tu fais un select *, soit u veux certaines champs et tu les listes..
    Dans ce cas ci, tu demandes tous les champs + une deuxième fois ceux que tu listes !
    Etant donné le nombre de table selectionnées, ça doit faire un paquet de champs quand même

    Ensuite, etrange de voir une requête avec des ID tellesques 1234567890 en dur ^^

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    hello !

    effectivement, le SELECT * est une erreur de ma part (un reste de mon premier essai de requête )

    j'ai donc modifier cela, me requête devient donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    $request =("select  	object.typeName as Name, 
    						object.typeID as id, 
    						flag.flagText as Flagtext, 
    						item.locationID as loca,
    						item.typeid,
    						item.quantity,
    						item.ownerid,
    						station.stationName as Stationname ,
    						station.stationID,
    						division.description
     
    			from  (	SELECT 	item.quantity, 
    							item.ownerid, 
    							item.typeid, 
    							loc.itemid, 
    							item.flag, 
    							loc.locationid 
    					FROM 	eveapi.corpassetlist as item
    					INNER JOIN eveapi.corpassetlist as loc 	ON loc.lft < item.lft and loc.rgt > item.rgt
    															AND loc.ownerid = 1234567890) item
    			inner join evedump.invtypes as object on item.typeid = object.typeid
    			inner join evedump.invflags as flag on item.flag = flag.flagID
    			left outer join eveapi.corpdivisions as division on flag.flagID = division.accountKey - 885 and division.ownerID=1234567890
     
    			left outer join evedump.stastations as station on item.locationID = station.stationID + 6000001
    			WHERE 
    			$loc
    			;");
    en ce qui concerne le ownerid=1234567890 il sera remplacer a terme par une variable $owner qui viendra suivant un $_POST. il ne sera donc pas en dur mais je doute que ceci fasse de ma requête une tortue de compétition... :p

    Pour info: Quand j'affiche ma page elle met une 30aine de secondes. puis une fois que j'ai charcher tous les $loc (qui mette chacun 30 secondes) la requete s'effectue en quelques millisecondes si je change de $loc.

  4. #4
    Membre actif
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Points : 215
    Points
    215
    Par défaut
    Si tu utilises pas mal ta requête :

    Prépare une requête SQL avec des paramètres nommés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    /* Exécute une requête préparée en passant un tableau de valeurs */
    $sql = 'SELECT nom, couleur, calories
        FROM fruit
    WHERE calories < :calories AND couleur = :couleur';
    $sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
    $sth->execute(array(':calories' => 150, ':couleur' => 'rouge'));
    $red = $sth->fetchAll();
    $sth->execute(array(':calories' => 175, ':couleur' => 'jaune'));
    $yellow = $sth->fetchAll();
    ?>
    Prépare une requête SQL avec des marqueurs


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    /* Exécute une requête préparée en passant un tableau de valeurs */
    $sth = $dbh->prepare('SELECT nom, couleur, calories
        FROM fruit
        WHERE calories < ? AND couleur = ?');
    $sth->execute(array(150, 'rouge'));
    $red = $sth->fetchAll();
    $sth->execute(array(175, 'jaune'));
    $yellow = $sth->fetchAll();
    ?>

Discussions similaires

  1. optimisation requete SQL
    Par lepierot dans le forum SQL
    Réponses: 20
    Dernier message: 13/09/2007, 15h47
  2. Optimisation requete SQL
    Par compu dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/07/2006, 09h23
  3. [MySQL] Requete SQL PHP
    Par CaptainChoc dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 22/10/2005, 16h13
  4. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52
  5. Optimisation requetes SQL
    Par joel90 dans le forum Administration
    Réponses: 18
    Dernier message: 15/05/2004, 21h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo