Optimisation de chargement d'une page qui contient 600 requêtes SQL

cs_chatis Messages postés 74 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 4 avril 2012 - 21 juin 2010 à 10:50
cs_chatis Messages postés 74 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 4 avril 2012 - 21 juin 2010 à 23:38
Bonjour à tous,

Je suis en train de faire le développement d'un système de gestion de court de tennis. Le système contient 11 courts de tennis et peut être réserver toutes les 15 minutes de 7h à 22h.

Ce qui veut dire que pour chaque terrain et pour chaque 15 minutes, je dois contrôler si le terrain est déjà réserver ou pas et l'afficher d'une certaine couleur si réserver ou pas et lui donner des droits d'interaction qui dépende de la personne connecté.

Pour résumé, sur ma page j'ai 11 terrains * 14 heures * 4 possibilités par heure = 616 requêtes sur la BDD !!!!!!!!!!

Vous vous rendez bien compte que la vitesse doit s'en ressentir.

Pour vous en rendre comptes, vous pouvez le tester sur : cs-maisonnex.ch

Ma question est : "Est-il possible d'afficher la page au fur et à mesure que les requêtes soit exécutées ?"

J'ai déjà testé de faire du cache mais cela ne me convient pas car la page change trop souvent pour que cela soit efficace.

Merci d'avance pour votre aide
A voir également:

10 réponses

syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
21 juin 2010 à 11:54
tu ne peux pas le faire en un seule requête qui incluerait le numéro de terrain et l'heure ?
S.
0
cs_chatis Messages postés 74 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 4 avril 2012
21 juin 2010 à 11:59
c'est déjà ce qui est fait

$sql "SELECT * FROM reservation WHERE Date'$date2' AND Terrain='$id'";
$sql =  mysql_query($sql) or die (mysql_error());
$res = mysql_fetch_array($sql); 


Mais cela ne change pas le problème car l'appel est de toute façon fait pour chaque petite case de la page...

Merci pour ta réponse
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
21 juin 2010 à 12:50
et donc si tu enlève ton WHERE pour traiter le résultat de ta requete dans une boucle PHP ??
S.
0
cs_chatis Messages postés 74 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 4 avril 2012
21 juin 2010 à 14:25
donc tu dirais qqch comme :

$sql = "SELECT * FROM reservation";
$sql =  mysql_query($sql) or die (mysql_error());
while($res = mysql_fetch_array($sql)){
if($res['Date'] == $date2 and $res['Terrain'] == $id)
{
...
}
}
 


Yes ca fait plus qu'une requête !! je vais voir ca..
0

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

Posez votre question
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
21 juin 2010 à 14:31
C'est quand même plus 'propre'.. même si mysql_query c'est un peu has been..
S.
0
cs_chatis Messages postés 74 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 4 avril 2012
21 juin 2010 à 15:17
Ok merci.. Mais en faites j'ai essayé dans mon code et cela ne marchera pas.. je suis "obligé" de laissé le WHERE.

car en faites mon code tourne comme ça actuellement (en gros):

for($heureDebut < $heureFin; $heureDebut++)
{
   foreach($terrain)
   {
      foreach($quartHeure)
      {
       $date = date("Ymd");
       $date = $date.$heureDebut.$quartHeure;

       aff_reservation($date, $terrain);
       }
   }
}


function aff_reservation($date,$terrain)
{
        $sql "SELECT * FROM reservation WHERE Date'$date2' AND Terrain='$id'";
$sql =  mysql_query($sql) or die (mysql_error());
$res = mysql_fetch_array($sql);
}



Je peux faire mon select en dehors de ma fonction et envoyé le résultat en tant que paramètre. Mais je ne sais pas si au final je gagne du temps car je dois quand même faire une boucle dans la fonction pour qu'il me donne la ligne que j'ai besoin.

et encore, dans cette fonction encore, j'ai 5 autres requêtes qui me permettent de récupérer la couleur de la réservation et les noms des personnes qui ont réservé à cette heure là.

Donc je pourrais faire les requêtes en dehors et les envoyer en paramètre mais est-ce qu'au final je gagnes du temps malgré que je dois faire des boucles pour ressortir la ligne que j'ai besoin ?

encore merci de ton aide

et si tu dis que mysql_query est has been, quel est la meilleure solution actuellement ?
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
21 juin 2010 à 17:03
Salut,

C'est peut être un peu limite en terme de code fourni et d'information pour tenter de t'aiguiller.
Il serait bon, je pense, que tu amènes plus de précisions :
- structure des tables
- quelles sont les 5 autres requêtes ?
- quelle est la signification des couleurs ? Comment sont elles déterminées ? Combien y en a t il au maximum ?
- etc ...

Il est en tout cas clair qu'il faut limiter le nombre de requêtes.


J'ai déjà testé de faire du cache mais cela ne me convient pas car la page change trop souvent pour que cela soit efficace.

Ce n'est sans doute pas la première chose à voir, mais je ne serais pas étonné qu'une mise en cache puisse apporter quelque chose, mais bon, avec le "peu" de données que tu as ce n'est sans doute pas nécessaire.


et si tu dis que mysql_query est has been, quel est la meilleure solution actuellement ?

Regarde du côté de mysqli et PDO

Cordialement,

Kohntark -
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
21 juin 2010 à 17:33
Je t'ai envoyé un MP concernant la sécurité de ton site.


Kohntark -
0
cs_chatis Messages postés 74 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 4 avril 2012
21 juin 2010 à 19:34
la structure des tables :
Dans ce cas, j'ai 4 tables qui sont concerné :

- la table terrain qui contient un IDTerrain ainsi qu'un nom
- la table membre qui contient un IDMembre et divers info sur le membre
- la table couleur qui contient un IDCouleur, un nom et une couleur au format #000fff
- la table reservation qui contient un IDReservation, 4 colonnes pour chaque personne qui jouent (IDMembre), un IDTerrain, un IDCouleur et finalement la date à laquelle ca a été réservé

les 5 requêtes sont :

- 4x un appel a membre qui pour rechercher les noms des 4 joueurs, (2 minimum et si c'est double il appelle 4x)
- 1x un appel à couleur pour déterminer la couleur à afficher dans la case (dépend du type d'abonnement de la personne qui fait la réservation). Il y a un maximum de 18 couleurs différentes qui correspondent aux différents cas de réservation possible (type d'abonnement, entrainement, tournoi, etc...)

pour le terrain, la requête est faite pour constituer la boucle au départ.

Sinon pour le cache tu dis que cela pourrait m'apporter quelque chose, mais je ne pense pas car le problème c'est que les possibilités d'interaction avec le tableau change toutes les 15 minutes, chaque personne qui se connecte n'a pas les mêmes possibilités de clics sur le tableau (beaucoup de contraintes au niveau des heures) et en cas de nouvelle réservation ou si une réservation est supprimée, le tableau change à nouveau. Donc il me parait difficile de faire un cache du tableau.....

Je suis en train de réfléchir à propos de la solution de syndrael. Mais est-ce vraiment mieux de faire la requête en dehors de la fonction et d'envoyer le résultat comme paramètre de la fonction et de faire une boucle ensuite pour sortir la ligne que j'ai besoin ?

merci de votre aide précieuse
0
cs_chatis Messages postés 74 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 4 avril 2012
21 juin 2010 à 23:38
Alors je viens de tester la solution qui m'était proposée ci-dessus, soit de faire les requêtes en dehors de la fonction et d'en suite faire dans la fonction une boucle avec un if pour récupérer la ligne du tableau dont j'ai besoin, mais il s'avère que c'est encore plus long à charger........ Auriez-vous une autre idée ?

encore merci
0
Rejoignez-nous