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 -
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 ?
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:
- Requete sql en php trop longue
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Logiciel sql - Télécharger - Bases de données
- Sql lister les tables ✓ - Forum Programmation
- Seigneur des anneaux version extra longue - Forum Cinéma / Télé
8 réponses
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 ) ^^
le premier or die est de trop, essaies sans (et le point virgule devant aussi faut l'enlever ) ^^
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 ?
ç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 ?
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ?
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 ?
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 ...
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 ...