Partage
  • Partager sur Facebook
  • Partager sur Twitter

Forum de discussion : trop lourd en requêtes

    25 mars 2011 à 15:41:34

    Bonjour,
    Je suis en train de créer un forum de discussion, et j'aurai besoin d'un peu d'aide.

    Pour chaque forum qui s'affiche en page d'accueil, je souhaiterai afficher pour chacun le nombre de sujet, de réponse et des informations sur le dernier message envoyé
    Le soucis, c'est que je réalise cela dans une boucle, et je trouve ça lourd au niveau du nombre de requête
    Pour chacun d'eux, j'exécute une requête pour :
    - Compter le nombre de sujet (SELECT COUNT(*) FROM....)
    - Compter le nombre de réponse (SELECT COUNT(*) FROM...)
    - Récupérer les infos sur le dernier fil de discussion dont l'état n'est pas " fermé " (SELECT ... FROM ... LEFT JOIN ...)

    Pour 10 forums, ça monte à plus de 30 requêtes :/
    Auriez-vous une solution à m'apporter ?
    Merci
    Alexis
    • Partager sur Facebook
    • Partager sur Twitter
      25 mars 2011 à 17:11:52

      Faire 1 requête. (enfin peut-être un peu plus si tu comptes les sous-requêtes)

      par contre si tu veux plus d'aide, va falloir plus d'infos (genre la structure des tables) :-° .
      • Partager sur Facebook
      • Partager sur Twitter
        25 mars 2011 à 17:29:51

        Ou diminue le nombre de fora ?
        • Partager sur Facebook
        • Partager sur Twitter
          25 mars 2011 à 17:36:02

          Ça réglera pas vraiment le problème, Chat Malade. Je veux pas paraître un peu trop agressif, mais il faut d'abord apprendre à coder proprement. Donc pas de requêtes dans des boucles.
          • Partager sur Facebook
          • Partager sur Twitter
            25 mars 2011 à 18:41:21

            Problème classique.

            Seule solution qui marche :

            - mettre dans la table topics, le nombre de posts du topic et l'id du dernier post

            - mettre dans la table forums, le nombre de topics, de posts et l'id du dernier post

            Tout ceci tenu à jour avec quelques triggers.

            • Partager sur Facebook
            • Partager sur Twitter
              26 mars 2011 à 0:14:27

              C'était bien sûr de l'humour, Fayden.
              • Partager sur Facebook
              • Partager sur Twitter
                26 mars 2011 à 9:19:42

                En effet la solution de Lord Casque Noir est bonne, mais conceptuellement parlant (CIF, cohérence, integrité, blablabla ...) elle est pas tip-top.
                Le mieux est de faire comme il dit mais dans des vues. Et tu pourrais donc t'affranchir des triggers.
                • Partager sur Facebook
                • Partager sur Twitter
                  26 mars 2011 à 10:46:12

                  Ah oui, bien sûr, ça dénormalise un peu, donc ce n'est pas idéal d'un point de vue théorique.

                  Citation : pierreet

                  Le mieux est de faire comme il dit mais dans des vues. Et tu pourrais donc t'affranchir des triggers.



                  Sauf qu'aucune BDD opensource (gratuite) ne supporte :
                  - les vues matérialisées
                  - les index sur les vues

                  Donc en pratique, la performance sera abominable.

                  L'intérêt de matérialiser ces infos dans les tables est de mettre des index dessus et d'éviter des count et jointures bien lourds. Exemple

                  SELECT * FROM topics WHERE forum_id = ? ORDER BY last_post_id DESC LIMIT 10;
                  


                  Requête qui utilise l'index sur topics(forum_id, last_post_id), donc 50 µs. Sans cette possibilité, les options disponibles sont toutes largement plus lentes...

                  Étonnant de voir conseiller autre chose alors que tous les forums connus fonctionnent de cette façon... (normal, c'est la seule).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 mars 2011 à 11:53:30

                    C'est sûr, si son SGBDR ne supporte pas les index sur les MV, il est bien mieux de prendre cette solution.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Forum de discussion : trop lourd en requêtes

                    × 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