Requete sql en php trop longue

Résolu/Fermé
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 - 27 juil. 2009 à 14:22
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 - 31 juil. 2009 à 14:00
Bonjour,

J'ai un tit problème en php actuellement j'ai mis en place à l'aide de certaine personne de ce même forum un requete complexe

et lorsque que je la lance depuis une page php la page reste blanche et est à noté en bas a droite Terminé

mon problème est que je sais que la requete met énormément de temps à se lancé entre 80s et 139s depuis mysql.

Voici à présent le code si vous savez comment faire pour que j'arrive a avoir la visu sa serait bien merci

//connexion au serveur MySQL
$connexion = mysql_connect("127.0.0.1","ID","PWD") or die ("Connect impossible to the SGBD.");

//selection de la BDD
$base = mysql_selectdb("base",$connexion) or die ("Sélection of the base impossible.");

//Requete

$sql = ("SELECT p1.id, TIMEDIFF( p2.date, p1.date ) as duree FROM atrium p1, atrium p2 WHERE p1.id LIKE '$code%' AND p1.site = p2.id AND p1.etat LIKE 'absence' AND p2.site LIKE '$code%' AND p2.etat = 'retour' AND p2.date > p1.date AND p1.date = ( SELECT max( p.date ) FROM atrium p WHERE site LIKE '$code%' AND etat = 'absence' AND p.date < p2.date ) AND p1.date BETWEEN '$dannee-$dmois-$djour $dheure:$dminute:$dseconde' AND '$fannee-$fmois-$fjour $fheure:$fminute:$fseconde' AND p2.date BETWEEN '$dannee-$dmois-$djour $dheure:$dminute:$dseconde' AND '$fannee-$fmois-$fjour $fheure:$fminute:$fseconde' ORDER BY p1.site, duree"); or die or die ("Sending the request impossible.");

//Affichage

$tim = mysql_query($sql);

while ($ligne = mysql_fetch_array($tim))
{
$site = $ligne[0];
$TIMEDIFF = $ligne[1];
echo "<tr><td>$site</td><td>$TIMEDIFF</td></tr>";
}

//Deconnection
mysql_close();
?>


La page reste blange hors que ci je lance la requete sql en direct elle fonctionne donc que faire et pourquoi ?

8 réponses

jeangilles Messages postés 816 Date d'inscription samedi 21 juin 2008 Statut Membre Dernière intervention 17 juillet 2012 186
27 juil. 2009 à 15:18
or die or die ("Sending the request impossible.");

le premier or die est de trop, essaies sans (et le point virgule devant aussi faut l'enlever ) ^^
1
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 46
27 juil. 2009 à 15:51
O la ... l'aveugle que je suis

Merci sa marche nickel à présent



yaouuuuuuuu
0
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
27 juil. 2009 à 17:23
ta requette est toujours aussi longue ???
ça me parait beaucoup trop long (sauf si tu as plusieurs centaines de milliers de lignes ... et encore)


Pour optimiser un petit peu le temps :
- les between ne sont peut être pas utile, puisque tu as déjà p2.date>p1.date , il suffirait que p1.date>datedébut et que p2.date<datedefin
- remplace le LIKE 'absence' par = 'absence'

Beaucoup plus important, vérifie que les champs utilisés pour la recherche soient tous indexés :
- id
- date
- etat
- site

d'ailleur ? c'est quoi comme info le $code ?
0
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 46
28 juil. 2009 à 09:56
juste une chaine de caractère pour l'id
0
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42 > Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011
28 juil. 2009 à 10:33
et tu es obligé d'utiliser un LIKE '$code%' ????
Ca ca peut faire ramer ...
Tu as vérifier les index sur les champs ?
0
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
27 juil. 2009 à 17:24
et essaye d'indenter ton code SQL (tu as le droit )

SELECT p1.id, TIMEDIFF( p2.date, p1.date ) as duree 
FROM atrium p1, atrium p2 
WHERE p1.id LIKE '$code%' 
	AND p1.site = p2.id 
	AND p1.etat LIKE 'absence' 
	AND p2.site LIKE '$code%' 
	AND p2.etat = 'retour' 
	AND p2.date > p1.date 
	AND p1.date = ( SELECT max( p.date ) 
					FROM atrium p 
					WHERE site LIKE '$code%' 
					AND etat = 'absence' 
					AND p.date < p2.date ) 
	AND p1.date BETWEEN '2008-08-08 10:10:10' AND '2008-09-09 10:10:10' 
	AND p2.date BETWEEN '2008-08-08 10:10:10' AND '2008-09-09 10:10:10' 
	ORDER BY p1.site, duree
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 46
28 juil. 2009 à 13:00
SELECT p1.id, TIMEDIFF( p2.date, p1.date ) as duree
FROM atrium p1, atrium p2
WHERE p1.id LIKE '$code%'
AND p1.site = p2.id
AND p1.etat LIKE 'absence'
AND p2.site LIKE '$code%'
AND p2.etat = 'retour'
AND p2.date > p1.date
AND p1.date = ( SELECT max( p.date )
FROM atrium p
WHERE id LIKE '$code%'
AND etat = 'absence'
AND p.date < p2.date )
AND p1.date BETWEEN '2008-08-08 10:10:10' AND '2008-09-09 10:10:10'
AND p2.date BETWEEN '2008-08-08 10:10:10' AND '2008-09-09 10:10:10'
ORDER BY p1.id, duree


Pardon il n y a pas de site c'étais dans l'ancienne base a présent c'est id

et donc id et date son indexé par contre etat non puisqu il ne peut comporter que deux valeurs est ce utile ou non ?
0
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 46
28 juil. 2009 à 13:01
(comment as tu fait pour mettre en forme ? )
0
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
28 juil. 2009 à 14:53
il faut indexer toutes les colonnes qui servent aux recherches ... sinon, mysql est obligé de scruter toutes les lignes.
D'ailleurs si la colonne etat ne contient que 2 valeurs, tu devrai utiliser le type ENUM(absent,retour) et pas CHAR. Comme ça, au lieu de tester une chaine de caractère, ça reviendrai à tester 0 ou 1 ... beaucoup plus rapide (même si tu ne change rien à ta requête).

Pour la mise en forme, tu as les boutons Gras,Italique,Souligné et Code juste au dessus du champ de saisie ...
0
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 46
31 juil. 2009 à 14:00
Je te remercie après indexation cela fonctionne beaucoup mieux

j'avais une erreur de date dans un ligne ce qui fessait bouclé la requete

mais c'est résolue merci encore
0