Partage
  • Partager sur Facebook
  • Partager sur Twitter

Optimiser requete MySql ?

Sujet résolu
    21 février 2006 à 16:54:43

    Bonjour a tous !! :D

    Je suis en train de créer un jeu php, et bon je suis hébergé chez one and one, ainsi que la base de donnée dont je me sers :) . Et... bah des fois ca rame :colere: . J'aime meme eu une fois une page générée en 60 secondes :p . Et il ya très très peu de membres... o_O

    Alors bon bah je cherche a optimiser mon code :D

    Voici un petit bout qui met souvent une a deux secondes pour etre executé :


            //Calcul du nombre de personnes connectées et nombre de membres.
            $retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM connectbisous WHERE ip='" . $_SERVER['REMOTE_ADDR'] . "'");
            $donnees = mysql_fetch_array($retour);
            if ($_SESSION['logged'] == true) {$connect=1;} else {$connect=2;}
            if ($donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter
            {
                    mysql_query("INSERT INTO connectbisous VALUES('" . $_SERVER['REMOTE_ADDR'] . "', " . time() . ", ".$connect.") ");
            }
            else // L'ip se trouve déjà dans la table, on met juste à jour le timestamp
            {
                    mysql_query('UPDATE connectbisous SET timestamp=' . time() . " WHERE ip='" . $_SERVER['REMOTE_ADDR'] . "'");
                    mysql_query('UPDATE connectbisous SET type=' . $connect . " WHERE ip='" . $_SERVER['REMOTE_ADDR'] . "'");
            }


    Alors.. heu si quelqu'un savait comment optimiser ca... ;) Je me suis dit que peut etre on peut joindre les 2 requetes update en une seule :euh: (vu que ca se trouve sur la meme ip), mais jsui pas sur, on peut faire plusieurs SET en meme temps ? c'est quoi la syntaxe ? :o

    Si vous voyez d'autres optimisations possibles... :D

    Sinon, le site en lui meme pour avoir un apercu (c'est encore en construction, ya rien de très interessant pour jouer) :

    http://bisouland.piwai.info (petit indice : ca parle de bisouuus... :D loool)

    Merci beaucoup !!

    @++

    Piwaï
    • Partager sur Facebook
    • Partager sur Twitter
      21 février 2006 à 17:01:05

      Salut,

      Pour les updates si ca touches les memes enregistrements tu peux en effet faire une seule requete. Voici la syntaxe :

      UPDATE maTable
      SET champ1 = $mavaleur,
      champ2 = $mavaleur2,
      champ3 = $mavaleur3,
      WHERE id = truc


      Tu as juste à séparer les champs que tu mes à jour par des virgules.

      ++
      • Partager sur Facebook
      • Partager sur Twitter
        21 février 2006 à 17:08:19

        Merci beaucoup !! :D J'ai modifié c'est bon :D.

        Bon, je crois pas qu'on puisse changer grand chose... o_O

        Ah si, puisque je suis la je vais en profiter : :)

        Et ca, c'est optimisable :euh: ??


                $retour = mysql_query('SELECT COUNT(*) AS nbre_visit FROM connectbisous WHERE type=2');
                $donnees = mysql_fetch_array($retour);
                $NbVisit=$donnees['nbre_visit'];
                $retour = mysql_query('SELECT COUNT(*) AS nbre_memb FROM connectbisous WHERE type=1');
                $donnees = mysql_fetch_array($retour);
                $NbMemb=$donnees['nbre_memb'];


        En gros, 2 requetes SELECT COUNT(*) qui se suivent, sur la meme table, le meme champ, mais juste une valeur ki diffère pour ce champ... Ca pourrait etre ramené a une seule ? o_O

        Merci beaucoup en tout cas :D:D:D

        @++

        Piwaï
        • Partager sur Facebook
        • Partager sur Twitter
          21 février 2006 à 17:16:03

          Lu,

          Essaye de tester ça :

          SELECT COUNT(*) AS nbre_visit FROM connectbisous WHERE type=2
          UNION
          SELECT COUNT(*) AS nbre_memb FROM connectbisous WHERE type=1


          <?php
          $sql="SELECT COUNT(*) AS nbre_visit FROM connectbisous WHERE type=2 UNION SELECT COUNT(*) AS nbre_memb FROM connectbisous WHERE type=1";
          $retour = mysql_query($sql);
          $donnees = mysql_fetch_assoc($retour); // UTILISE QUE DES array_assoc !
          $NbVisit=$donnees['nbre_visit'];
          $NbMemb=$donnees['nbre_memb'];


          ++
          • Partager sur Facebook
          • Partager sur Twitter
            21 février 2006 à 17:36:32

            Ca marche niquel !!! :D:D

            Merci encore !! ;)

            Par contre je comprend pas trop ca :

            mysql_fetch_assoc :(

            et

            // UTILISE QUE DES array_assoc ! :(

            D'après la doc : mysql_fetch_assoc -- Lit une ligne de résultat MySQL dans un tableau associatif :euh:

            Heuuu.. ok, mais ca apporte quoi de l'utiliser :o ??? Le tuto de matéo l'utilise pas... :p Mais bon, il doit y avoir une explication très simple :D:D:D .

            Merci encore !! :D:D

            @++

            Piwaï
            • Partager sur Facebook
            • Partager sur Twitter
              21 février 2006 à 17:58:06

              L'exlication très simple est que M@téo connait rien à l'optimisation.

              mysql_fetch_array retourne de nombreux tableaux associatifs.

              mysql_fetch_assoc retourne un unique tableau associatif. Du points de vue utilisateur, c'est strictement la même chose car couramment les gens utilisent : $row['mon_champs'].

              Mais on peut également utiliser : $row[0]. Chose que l'on fait pas, mais que mysql_fetch_array crée au cas ou. L'utilisation de mysql_fetch_assoc fait que MySQL ne crée par ce tableau et donc travaille 2 fois plus rapidement !
              • Partager sur Facebook
              • Partager sur Twitter
                21 février 2006 à 18:33:48

                Merci beaucoup :D !! C'est une information très interessante ;) ... heu :euh: ... et ya personne pour corriger les tutos officiels sans passer par matéo ?? (il est déjà bien occupé, fodré po le surcharger...)..

                Mais bon c'est quand meme capital comme info, quand tu fais des masses de requetes par page !!

                Merci encore :)

                @++

                Piwaï
                • Partager sur Facebook
                • Partager sur Twitter
                  21 février 2006 à 18:44:01

                  ca m'a l'air interressant ca :D

                  tu conseil donc de tout le temps utiliser mysql_fetch_assoc au lieu de mysql_fetch_array sauf si on utilise $var[nombre] c'est ca ?

                  je voudrais etre sur d'avoir bien compris pour pas faire de connerie :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 février 2006 à 20:16:40

                    SELECT * au passage est à bannir, il faut toujours demander à MySQL les champs que l'on utilise vraiment !

                    Imaginons que l'on prenne 3 champs.

                    SELECT toto, titi, tata FROM maTable LIMIT 1


                    Sélectionner une ligne, les champs toto, titi, tata de la table maTable

                    Si je fais fetch_array alors :

                    $data['toto'], $data['titi'], $data['tata'] existe mais également $data[0], $data[1], $data[2] avec $data[0]=$data['toto'], $data[1]=$data['titi'], $data[1]=$data['tata']

                    Complètement inutil !

                    Fetch_assoc conserve que ceux en texte à savoir $data['toto'], $data['titi'], $data['tata'] et ne s'emebete pas à créer ceux avec les numéros, soit 2 fois moins de travail deux fois plus rapide.



                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 février 2006 à 8:45:36

                      Heu... a propos du UNION Jordan...

                      Finalement ca marche pas, enfin il comprend que la premiere requete, et Nbmemb ne renvoi rien, il n'est pas défini... :( (j'avais pas fait gaffe, et en fait ya ke NbVisit qui est bien défini)

                      Bon bah je vais remettre en 2 requetes... :euh:

                      Merci quand meme pour tes informations :)

                      @++

                      Piwaï
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Optimiser requete MySql ?

                      × 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