web-dev-qa-db-ja.com

非常に遅いクエリ

このクエリは機能しますが、Quad Core専用サーバーで実行するには20秒以上かかります。これを最適化するにはどうすればよいですか。

$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. 明示的な投稿タイプ、すなわち'post_type' => array('post','music'...)を使用してください。今のところあなたのクエリはリビジョンと添付ファイルもチェックしています、そしてそれらはおそらくあなたのDBの投稿の半分です。

  2. コードから、どの分類法がクエリに関連するかを事前に知っておく必要があります(用語番号36が4つすべての分類法に関連する意味を持つことはほとんどありません)。関連する分類法についてのみ照会する必要があります。

  3. 最新の5つの投稿が必要な場合は、新しい投稿が追加されたときにその場で計算して、クエリを使用しないようにします。

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

このようにしてあなたのクエリは

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

唯一の問題は、deleteで何をすべきかということです、そして、あなたはおそらくあなたがあなた自身のクエリを実行するべきですが、それは非常にまれなイベントであるべきです。

1
Mark Kaplun

クエリ自体が遅いかどうか、または他の何かがそれを遅くするかどうかを確認するには、データベースでクエリを直接実行し、それにかかる時間を調べます。

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

これはあなたのデータベースでWordPressが実行した最新のクエリを表示します。

データベース内でクエリが本当に遅い場合は、結果をキャッシュしてみてください。この特定のクエリは1時間に1回程度しか実行しないでください。私はたいていメニューでこれをします - しかしそれはどんなものでも働きます。トランジェントを使用して出力HTMLを保存する。

私はこのテクニックについて書いた ここ

分類法ごとに異なる出力が必要な場合は、トランジェントの名前にTermIDを追加してみてください。

'update_post'でトランジェントを削除するか、または一定時間経過後にトランジェントを期限切れにすることができます。

1
fischi