web-dev-qa-db-fra.com

Requête très lente

Cette requête fonctionne, mais il faut plus de 20 secondes pour s'exécuter sur un serveur dédié Quad Core ... Comment puis-je optimiser cela?

$slides=get_posts(
    array('post_type' => 'any', 'numberposts' => 5, 'orderby' => 'date', 'order' => 'desc', "tax_query" =>
        array(
                "relation" => "OR",
                 array(
                    "field" => "id",
                    "terms" => array(36),
                    "taxonomy" => "category",
                    "operator" => "IN"
                ),
                array(
                    "field" => "id",
                    "terms" => array(36),
                    "taxonomy" => "music-categories",
                    "operator" => "IN"
                ),
                array(
                    "field" => "id",
                    "terms" => array(36),
                    "taxonomy" => "video-categories",
                    "operator" => "IN"
                ),
                array(
                    "field" => "id",
                    "terms" => array(36),
                    "taxonomy" => "mixtape-categories",
                    "operator" => "IN"
            )
            )
        )
);
3
b747fp
  1. Utilisez des types de publication explicites, à savoir 'post_type' => array('post','music'...). À l'heure actuelle, votre requête vérifie également les révisions et les pièces jointes, qui représentent probablement la moitié de la publication dans votre base de données.

  2. D'après votre code, vous devez savoir à l'avance quelle taxonomie est pertinente pour votre requête (il est peu probable qu'un terme numéro 36 ait une signification pertinente dans les 4 taxonomies). Vous devez interroger uniquement les taxonomies pertinentes.

  3. Si vous avez juste besoin des 5 derniers articles publiés, alors vous devriez peut-être le calculer à la volée lorsque de nouveaux articles sont ajoutés, en évitant d'utiliser la requête.

    add_action('publich_post','my77483_change_cache');
    function my77483_change_cache($post_id,$post) {
      if (not meeting criteria)
        return;
      $chached = get_option('my77483_query_cache');
      if (count($cached) == 5) 
        array_shift($cached); // remove the oldest post. 
      $cached[] = $post_id;
      update_option('my77483_query_cache',$cached);
    }
    

De cette façon, votre requête devient

$chached = get_option('my77483_query_cache');
$posts = get_posts('post__in' => $cached);

Le seul problème est que faire en suppression, alors peut-être que vous devriez exécuter votre requête originale, mais cela devrait être un événement très rare.

1
Mark Kaplun

Pour vérifier si la requête elle-même est lente ou si quelque chose d'autre la ralentit, essayez d'exécuter votre requête directement dans la base de données et examinez le temps qu'elle prend ici.

<?php echo $GLOBALS['wp_query']->request; ?>

Cela vous montre la dernière requête que WordPress a exécutée dans votre base de données.

Si la requête est vraiment lente dans la base de données, essayez de mettre les résultats en cache, en n'exécutant cette requête qu'une fois toutes les heures environ. Je le fais habituellement avec des menus - mais cela fonctionne avec n'importe quoi. Utilisation de transitoires pour enregistrer le code HTML de sortie.

J'ai écrit à propos de cette technique ici .

Si vous avez besoin d’une sortie différente pour différentes taxonomies, essayez d’ajouter TermID au nom du transitoire.

Vous pouvez supprimer les transitoires sur 'update_post' ou les laisser expirer après un certain temps.

1
fischi