1

私は MySQL クエリについて十分な知識がありませんが、それが示されています。

すべての投稿にカスタム フィールドを設定しています。カスタム フィールドは、投稿のソース URL を「source_url」というキーに保存します。

以下の WP_Query パラメータで動作させていますが、信じられないほど遅いです。50 以上の URL を検索できることに注意してください。

したがって、ソース URL の配列を指定して、一致する投稿を取得したいと考えています。

たとえば、これは私が現在持っている WP_Query で遅いものです:

// var_dump of $urls array (this could be 50+ urls)
array(7) {
  [0]=>
  string(42) "http://www.youtube.com/watch?v=FMghvnqDhT8"
  [1]=>
  string(42) "http://www.youtube.com/watch?v=RY-yUFpXTnM"
  [2]=>
  string(58) "http://www.youtube.com/watch?v=nIm2dnyJ1Ps&feature=related"
  [3]=>
  string(42) "http://www.youtube.com/watch?v=NoCtRQlJAqM"
  [4]=>
  string(57) "http://holidaycustoms.blogspot.com/2012/08/busy-week.html"
  [5]=>
  string(42) "http://www.youtube.com/watch?v=DcZvg197Ie4"
  [6]=>
  string(42) "http://www.youtube.com/watch?v=7P3UEbLmLuo"
}

// Build Media Query
$meta_query = array(
    'relation' => 'OR'
);
foreach( $urls as $url ) {
    $meta_query[] = array(
                        'key'       => 'source_url',
                        'value'     => $url
                    );
}

// Get 20 matching posts from a category set by a variable
$args = array(
    'post_type'        => 'post',
    'posts_per_page'   => 20,
    'orderby'          => 'rand',
    'cat'              => $cat_ID,
    'meta_query'       => $meta_query
);
$posts = get_posts($args);        

私がやろうとしているのは、上記のコードをカスタムクエリの選択に置き換えることです。これは、 WP_Query よりもはるかに高速です

しかし、MySQL や WP データベースについて、カスタム選択クエリを作成するのに十分な知識がありません。誰でも助けることができますか?前もって感謝します!

4

1 に答える 1

0

あなたが自分自身をリンクした投稿では、最初の返信ですでに次のように述べられています

[...] デフォルトのスキーマには、値の列にインデックスさえありません

これは、クエリ ジェネレーターで発生する問題よりもはるかに深刻な問題です。インデックスがないと、DBMS はテーブル全体を走査し、各フィールドの文字列を比較する必要があるためです。

インデックスの追加は、 PHPMyAdminなどの適切な管理ツールを使用するとかなり簡単です。インデックスを追加する必要がある問題のあるテーブルは呼び出されwp_postmeta、インデックスが必要なフィールドはmeta_valueであり、インデックス タイプは である必要がありますINDEX

インデックスの追加は透過的であり、パフォーマンス以外の wordpress には影響しません。ただし、MySQL はテーブル全体をトラバースする必要があるため、時間がかかる場合があります。また、文字列データにインデックスを付けているため、インデックスは非常に大きくなります。


また、クエリに適切な構造を使用してみてください。OR現在、値が異なるが常に同じフィールドを持つ大きな ed セレクションを使用しています。まさにそのための構造があり、それは と呼ばれていINます。

...
// Build Media Query
$meta_query = array();
$meta_query[] = array(
    'key'       => 'source_url',
    'value'     => $urls,
    'compare'   => 'IN'
);

// Get 20 matching posts from a category set by a variable
..

(テストされていません。実際にこれを行ったことはありません。参照)

インデックスを追加する場合と比較して、パフォーマンスの向上はごくわずかですが、コードははるかに単純になります。

于 2012-09-02T06:10:20.550 に答える