Partage
  • Partager sur Facebook
  • Partager sur Twitter

Optimisation requête PHP/SQL

Débutant inside

    31 octobre 2014 à 12:24:24

    Bonjour,

    Pour un site Wordpress, j'ai créé une fonctionnalité qui me permet d'associer les articles d'un custom_post_type aux articles classiques (actualités). En gros, lorsque je crée un article quelconque, j'ai une requête PHP (utilisant WP_Query) qui vient récupérer la totalité des pages de mon custom_post_type. Sauf que ma requête vient de dépasser le millier de références et je me dis qu'il y a sûrement moyen d'optimiser ça (car les ressources processeur s'affolent).

    Je ne suis pas spécialement développeur et mes notions d'architecture s'en trouvent limitées. J'ai eu plusieurs pistes en tête et je souhaite vous les partager pour que vous me disiez "Très bien" ou "Mer il et fou ne fais surtout pas ça".

    • 1. D'abord, cette requête est au chargement de la page d'édition ou de création d'un article, comme nous n'en avons pas toujours besoin (surtout lors de l'édition car nous avons déjà fait l'association), je me dis que je peux assigner la requête à un bouton quelconque pour faire la requête sur demande.
    • 2. J'ai un millier de références sur toute ma période (2011-2014 en gros) mais en règle générale nous avons besoin de celle de l'année en cours et de l'année précédente on va dire, donc je pourrai sortir de ma requête celles de 2011 et 2012 et avoir un autre bouton d'action pour charger ces vieilles références quand c'est nécessaire. Ce point 2 me permettrait de cantonner la requête de base à 500 références à tout casser et dans de rares cas, faire appel à la requête complète. Est-ce intéressant de coupler ce point 2 au point 1 ?
    • 3. Mes références changent peu souvent et on va dire que globalement, j'ai 10 nouvelles actualités à associer avant d'avoir une nouvelle référence. Je me suis dit que plutôt que faire une grosse requête dans mes bases, je pourrai générer un fichier XML par exemple avec les infos qui me servent à faire l'association et qui serait mis à jour à chaque création d'une référence ou lorsqu'un élément clé d'une référence existante est modifiée (ex : le nom). Ma requête pourrait alors se faire sur ce fichier XML plutôt que sur les bases elles-mêmes. Mais je ne sais pas vraiment si ce point 3 est pertinent dans mon cas (soulager les ressources processeur) voire pertinent tout court. Et s'il l'est, est-ce intéressant de le coupler au point 2. Ce qui ferait 2 fichiers XML dont un, le plus gros, serait mis à jour une fois par an par exemple (une référence vieille d'un an ou plus n'a aucune chance de connaître une modification fondamentale : nom, ID...)

    Que pensez-vous de ces différentes pistes ? Je n'ai pas d'autres pistes en tête mais si vous en avez je suis preneur.

    Merci pour votre aide,

    Ps : je ne savais pas trop où poster mon sujet donc je suis resté dans un thème très général :)

    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2014 à 14:29:14

      Si une BDD rame avec seulement 1000 lignes il y a un sérieux problème quelque part, genre une orgie de full join ou de sous-requêtes.

      C'est quoi la requêtes et les tables ? Je connais pas wordpress.

      • Partager sur Facebook
      • Partager sur Twitter
        5 novembre 2014 à 11:12:04

        Merci pour ton retour,

        Voici la requête :

        <?php $attachement_type = array('gamecard', 'studios', 'gameengine');foreach ($attachement_type as &$at) { $the_query = new WP_Query(array('post_type' => $at, 'posts_per_page'=>'-1','orderby'=>'title','order'=>'asc'));if( $the_query->have_posts()){?><optgroup label="<?php $post_type=get_post_type_object($at);echo $post_type->label; ?>">
        
        <?php while($the_query->have_posts()):$the_query->the_post(); $value=get_the_ID(); ?>
        
              [Affichage des résultats -> Titre du post + ID]
        
        	 <?php endwhile; } ?></optgroup><?php } ?>

        C'est dans une liste déroulante avec une sélection par défaut sur la valeur enregistrée s'il y en a une, assez classique.

        Je récupère trois types d'articles : gamecard, studios, gameengine, les trois issus de la même table WP_posts qui contient des infos basiques (ID, date de création, dernière date de modification, titre, contenu du post, nombre de commentaires...). Je sépare les trois types par un foreach, je ne sais pas si c'est le meilleur choix (= trois requêtes ?), mon objectif avec le foreach est de pouvoir regrouper les articles par thème (gamecard, studios, gameengine) d'où le optgroup que je laisse dans ma requête histoire que tu vois.

        Derrière WP_posts, il y a deux autres tables, une pour les commentaires, l'autre pour les post_meta, un post_meta dans Wordpress c'est une information secondaire. En faisant des recherches sur Internet, j'ai effectivement vu que le comportement de Wordpress dès que l'on utilise leur fonctionnalité de query, il récupère toutes ces infos. J'ai lu comment désactiver ces éléments.

        • Partager sur Facebook
        • Partager sur Twitter
          5 novembre 2014 à 19:49:53

          Ca c'est du code php, il faut voir la requete sql générée et son explain...
          • Partager sur Facebook
          • Partager sur Twitter

          Optimisation requête PHP/SQL

          × 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