web-dev-qa-db-ja.com

一つの大きなクエリ、またはいくつかの小さなクエリ?

私は、Ajaxを介して、ランダムな順序で大量の投稿をクエリする必要があるアプリを開発しています。このようなもの:

$query = new WP_Query( array( 'posts_per_page' => 50, 'orderby' => 'Rand' );

サイトの性質上、多くの投稿が必要になる可能性があります(合計250〜300の投稿があります)。それで、彼らがより多くの投稿を必要とするならば、私は私がすでに使ったことのある投稿の配列を送らなければならないということを除いて、私は再び質問しなければならないでしょう。

一度にすべての投稿を取り込む方が効率的でしょうか。それとも人々が投稿を使い果たすたびに50の投稿を取り込むのですか?

あるいは、検索やデータベースを最適化する他の方法はありますか。そのため、すべての質問を一度に取り込むのにそれほど時間がかかりませんか?

更新:わかりやすくするために。これらは短い宣伝文句(1〜2文)しかないカスタム投稿です。タグ、機能画像、カスタムフィールドなどはありません。それらを1つのカテゴリでフィルタリングする必要があるため、クエリは次のようになります。

$query = new WP_Query( array ( 
    'orderby' => 'Rand', 
    'posts_per_page' => '50', 
    'cat' => '3', 
    'post_type' => 'quote' 
) );
1
coopersita

それは地域の要因と実際の使用パターンに依存します。クエリが大きくなるほど、データを保存するためにより多くのメモリが必要になります。また、使用するプラグインによっては、応答に処理するために処理が必要になる可能性があるため、メモリが不足する危険性が高くなります。応答が大きい(つまり、ページHTMLが大きい)と、ページをブラウザに転送するのに時間がかかり、帯域幅が狭い人にとってはページの読み込みが遅くなるように感じます。

これらが人々が「もっとロード」して無限のスクロールメカニズムに時間を浪費している理由ですが、テクノロジーは常に良くなっていますし高速になるので、決定のしきい値として役立つ数を与えることは不可能だと思いますAJAXが必須であり、単なる「持っていること」ではありません。

UXの観点は、この2つを決定するための最も重要な要素かもしれません。これらの投稿が人間が読むべき記事であれば、20個でも多すぎるかもしれませんが、スプレッドシートの場合は、一度にすべてをロードすることをお勧めします。

EDIT

ランダム性という問題の最も重要な部分を逃しました。無作為性とページングは​​強制できますが確実にうまくいかない場合がありますが、無作為性を達成するより簡単な方法は、すべての投稿をクエリして配列に格納し、配列をランダム化して1時間のトランジェントとして格納することです。

$posts = get_tranient('my posts');
if (!$posts) {
  $posts = get_posts(your args);
  shuffle($posts);
  set_transient('my posts',$post,HOUR_IN_SECONDS);
}
... slice the part of $posts you are interested in and work on it ...

時間の境界でページを表示するときにこのロジックにはまだ穴がありますが、現実的には1時間に1回重複する結果に誰も気付くことはありません。明るい面では、それはあなたが時間ごとに一度だけ遅いクエリを実行することを意味し、各リクエストに対してではありません。

質問の更新部分については、私は自分でテストしたことはありませんが、メモリサイズは投稿自体のテキストサイズと直線的に関連していないため、投稿に関連するメタデータを考慮する必要があります。メモリ使用量が基本的に2倍になる可能性があるメモリキャッシュ(キャッシュを防ぐ方法があるはずですが、今は見つかりません)。

それはあなたが一度にすべての300の引用符を提供することができるということかもしれませんが、人間がそんなに「あきらめて」テキストを読むつもりはないのでAJAXを介してより多くを提供することにさえ。

4
Mark Kaplun