Requete sql en php trop longue

Résolu
Christr Messages postés 319 Date d'inscription   Statut Membre Dernière intervention   -  
Christr Messages postés 319 Date d'inscription   Statut Membre Dernière intervention   -
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 ?
A voir également:

8 réponses

jeangilles Messages postés 816 Date d'inscription   Statut Membre Dernière intervention   186
 
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   Statut Membre Dernière intervention   46
 
O la ... l'aveugle que je suis

Merci sa marche nickel à présent



yaouuuuuuuu
0
imw Messages postés 233 Date d'inscription   Statut Membre Dernière intervention   42
 
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   Statut Membre Dernière intervention   46
 
juste une chaine de caractère pour l'id
0
imw Messages postés 233 Date d'inscription   Statut Membre Dernière intervention   42 > Christr Messages postés 319 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   42
 
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   Statut Membre Dernière intervention   46
 
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   Statut Membre Dernière intervention   46
 
(comment as tu fait pour mettre en forme ? )
0
imw Messages postés 233 Date d'inscription   Statut Membre Dernière intervention   42
 
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   Statut Membre Dernière intervention   46
 
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