web-dev-qa-db-ja.com

Meta_queryによるWP_Queryのパフォーマンスの問題

私は空ではない2つのカスタムフィールドを持つ2つの投稿タイプから投稿を選択するためにWP_Queryインスタンスを使用する新しいテーマのためのカスタムテンプレートに取り組んでいます。サイトのセクションによっては、検索するカテゴリを決定するために$current_zone変数を設定することができます。

// Custom loop
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$custom_loop_args = array(
    'post_type' => array('videos', 'post'),
    'post_status' => 'publish',
    'ignore_sticky_posts' => 1,
    'paged' => $paged,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'article_source',
            'compare' => '!=',
            'value' => ''
        ),
        array(
            'key' => 'article_link',
            'compare' => '!=',
            'value' => ''
        )
    )
);

// Check the current zone
global $current_zone;

// Check for category match to current zone
if ( term_exists($current_zone, 'category') ) {
    $term = get_term_by('name', $current_zone, 'category');
    $custom_loop_args['cat'] = $term->term_id;
}

// Create unique identifier for caching
$cache_id = ( isset($term) ) ? '_term-' . $term->term_id : '_main';

// Run query or get transient cache
if ( ( $custom_loop = get_transient( "curated_wpquery$cache_id" ) ) === false ) {

    // It wasn't there, so regenerate the data and save the transient
    $custom_loop = new WP_Query( $custom_loop_args );
    set_transient( "curated_wpquery$cache_id", $custom_loop, ( 60 * 60 * 1 ) );
}

私はこれをスピードアップするためにトランジェントを使っていますが、これはうまくいきますが、最初のクエリは完了するまでに35秒かかり、狂った量のメモリを必要とします。 postsテーブルには約10,553レコードのある、とても大きなデータベースがあります。改訂をクリアしましたが、パフォーマンスの向上に気づいたことはありません。

それで、私の本当の質問は、このクエリのパフォーマンスをどのように向上させることができるかということです。カスタムの$wpdbクエリが最善でしょうか、それともカスタムフィールドへのこのような方法での問い合わせは全く生産的ではないでしょうか。

任意の助けは大歓迎です。

2
Kevin Leary

カスタムフィールドデータはpostmetaテーブルに格納されているので、このテーブルをスキャンすると遅くなる可能性があります。

あなたがすべき:

  • デバッグバープラグイン をインストールすると、データベースに対して実行されているクエリの詳細がわかります。それぞれの長さを確認できます。 queryがかかり、実行されている実際のSQLコード。
  • 実行に時間がかかるクエリを探し、 EXPLAIN と入力します。これにより、何が起こっているのか、そしてどのように進めるのかについて、より良いアイデアが得られます。
5
anu