Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete SQL lente

    18 octobre 2018 à 6:00:06

    Bonjour, j'ai une "Requete SQL lente", environ 4.2 seconde pour s'afficher ....

    enfait j'ai exactement la meme requete sauf un parametre qui change,

    une fois la ville, puis le département et enfin la région.

    Le nombre d'entrée est importante peut etre que ça vient de la ....

    La requete pour la ville par exemple :

    // Exécution
     $sql = $bdd->prepare("SELECT * FROM `loisirs`  JOIN evenement_date ON evenement_date.code = loisirs.code AND city= '".$_GET['ville']."'  ORDER BY `evenement_date`.`date_event` ASC LIMIT ".intval(($page-1)*$parPage).", ".$parPage);
    $sql->BindParam(':city',$_GET['ville']);
     $sql->execute();



    le nombre d'entée environ 2000, mais avec mon LIMIT j'en affiche que 20

    pour le département environ 5500 entrées et 20000 entrées pour la région....

    Je suis ouvert à toute piste pour améliorer la rapidité d'éxécution

    PS: j'ai préciser les champs au lieux de mettre * dans le select mais c'est pareil

    -
    Edité par blinz 18 octobre 2018 à 6:00:37

    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2018 à 8:18:25

      Bonjour,

      Es tu sûr que le problème vient de la requête ? car moi je lis dans ton post "pour s'afficher" ... donc dans le temps que tu indiques et à partir du clic, il y a la requête mais aussi le transfert des données vers le navigateur, le traitement et l'affichage côté navigateur.

      Tu fais une jointure mais combien d'événement sont dans la table evenement_date ?

      Peut-être que ton modèle que l'on ne connait pas est à optimiser ... index .... autre relation ... etc.

      A+

      -
      Edité par monkey3d 18 octobre 2018 à 8:25:56

      • Partager sur Facebook
      • Partager sur Twitter
        18 octobre 2018 à 10:35:05

        Bonjour,

        Le mieux serait que tu nous donne le résultat complet d'un EXPLAIN pour avoir une idée de ce qu'il se passe.

        EXPLAIN SELECT * FROM `loisirs`  
        INNER JOIN evenement_date ON evenement_date.code = loisirs.code AND city= '".$_GET['ville']."'  
        ORDER BY `evenement_date`.`date_event` ASC 
        LIMIT ".intval(($page-1)*$parPage).", ".$parPage


        a+

        • Partager sur Facebook
        • Partager sur Twitter
          18 octobre 2018 à 16:41:02

          Donc par exemple, pour une ville comme brest :

                       
          id select_type table partitions type possible_keys key key_len ref rows filtered Extra  
          1 SIMPLE evenement_date NULL ALL NULL NULL NULL NULL 20120 100.00 Using temporary; Using filesort
          1 SIMPLE loisirs NULL ALL NULL NULL NULL NULL 13548 1.00 Using where; Using join buffer (Block Nested Loop)
                 
                                 

          une région comme la Bretagne:

          id select_type table partitions type possible_keys key key_len ref rows filtered Extra  
          1 SIMPLE evenement_date NULL ALL NULL NULL NULL NULL 20120 100.00 Using temporary; Using filesort
          1 SIMPLE loisirs NULL ALL NULL NULL NULL NULL 13548 1.00 Using where; Using join buffer (Block Nested Loop)

          Par contre je n'ai pas d'index de défini sur ma table evenement date

          uniquement une colonne code (correspond  aux numéro d'évènemenent mais plusieur fois le même numéro car plusieur date pour le même évenement parfois, puis une colonne date_debut et une date_fin

          -
          Edité par blinz 18 octobre 2018 à 16:49:24

          • Partager sur Facebook
          • Partager sur Twitter
            18 octobre 2018 à 17:34:40

            Les jointures basé sur des chaînes de caractères sont très lente il faut toujours préférer des jointures sur clef étrangère qui sont des  entiers non signé.

            Je me suis déjà fait avoir en faisant des jointure sur des hash de 32 charactères.

            Il faut que tu déplace ta condition sur city dans un WHERE.

            -
            Edité par Cobs 18 octobre 2018 à 17:34:55

            • Partager sur Facebook
            • Partager sur Twitter
              18 octobre 2018 à 17:46:42

              pour ville et département ça passe.

              Par contre avec région c'est lent très lent, environ 2000 entrées pour ma table loisir et 13000 entrées pour la table evenement_date....

              Coté requete j'ai donc fait le déplacement, merci pour le tuyau ;) mais pour la région ça rame

              // Exécution
              		$sql = $bdd->prepare("SELECT * FROM `loisirs`  JOIN evenement_date ON evenement_date.code = loisirs.code AND region= '".$val_region."' WHERE evenement_date.date_fin_event >= NOW() ORDER BY `evenement_date`.`date_event` ASC LIMIT ".intval(($page-1)*$parPage).", ".$parPage);
              $sql->BindParam(':region',$val_region);
              $sql->execute();



              • Partager sur Facebook
              • Partager sur Twitter
                18 octobre 2018 à 20:45:33

                Là tu utilises bindParam sans avoir de paramètre à binder déjà
                • Partager sur Facebook
                • Partager sur Twitter
                $2b||!$2b

                Requete SQL lente

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown