it-swarm.com.de

Sehr langsame Abfrage

Diese Abfrage funktioniert, aber es dauert mehr als 20 Sekunden, um auf einem dedizierten Quad Core-Server ausgeführt zu werden ... Wie kann ich dies optimieren?

$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. Verwenden Sie explizite Beitragstypen, d. H. 'post_type' => array('post','music'...). Im Moment überprüft Ihre Abfrage auch Revisionen und Anhänge und sie sind wahrscheinlich die Hälfte des Beitrags in Ihrer DB.

  2. Aus Ihrem Code geht hervor, dass Sie im Voraus wissen sollten, welche Taxonomie für Ihre Abfrage relevant ist (es ist unwahrscheinlich, dass ein Begriff mit der Nummer 36 in allen vier Taxonomien eine relevante Bedeutung hat). Sie sollten nur die relevanten Taxonomien abfragen.

  3. Wenn Sie nur die 5 zuletzt veröffentlichten Beiträge benötigen, sollten Sie diese möglicherweise sofort berechnen, wenn neue Beiträge hinzugefügt werden, ohne die Abfrage verwenden zu müssen.

    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);
    }
    

Auf diese Weise wird Ihre Anfrage

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

Das einzige Problem ist, was beim Löschen zu tun ist. Dann sollten Sie vielleicht Ihre ursprüngliche Abfrage ausführen, aber das sollte ein sehr seltenes Ereignis sein.

1
Mark Kaplun

Um zu überprüfen, ob die Abfrage selbst langsam ist oder ob sie durch irgendetwas anderes verlangsamt wird, versuchen Sie, die Abfrage direkt in der Datenbank auszuführen, und überprüfen Sie, wie lange sie dort dauert.

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

Dies zeigt Ihnen die neueste Abfrage, die WordPress in Ihrer Datenbank ausgeführt hat.

Wenn die Abfrage in der Datenbank sehr langsam ist, versuchen Sie, die Ergebnisse zwischenzuspeichern, und führen Sie diese bestimmte Abfrage etwa einmal pro Stunde aus. Normalerweise mache ich das mit Menüs - aber es funktioniert mit allem. Verwenden von Transienten zum Speichern des Ausgabe-HTML.

Ich schrieb über diese Technik hier .

Wenn Sie für verschiedene Taxonomien unterschiedliche Ausgaben benötigen, fügen Sie die TermID im Namen des Transienten hinzu.

Sie können die Transienten entweder in 'update_post' löschen oder nach einer bestimmten Zeit ablaufen lassen.

1
fischi