私が抱えている問題は、ユーザーが投稿をフィルタリングできるようにするとデータベースが圧倒され、処理が非常に遅くなることです。メタ値を使用して投稿をクエリするための最良の方法が何であるかわかりません。私のサイトには、メタ値を含むチェックボックスに基づいて投稿をフィルタリングするためにユーザーが送信できるフォームがあります。私は現在サイトが個々のpost_metaキーのために選択されたチェックボックスから配列を作るようにしています:
for ($i=0; $i< count($amenities); $i++)//where $amenities is an array of selected checkbox values
{ //$arrays is the array that stores the arrays of checkboxes for different meta keys
$count = count($arrays);
$arrays[$count] = array(
'key' => 'amenities',
'value' => $amenities[$i],
'compare' => 'LIKE'
);
}
次に、各meta_keyに対して選択された値を含む配列の配列を使用してデータベースに問い合わせます。このような:
$the_query = new WP_Query(array(
'post_type' => 'listing',
'post_status' => 'publish',
'category_name' => 'private_rental',
'orderby' => 'Rand',
'meta_query' => $arrays
));
これを実行すると、必要な結果が得られますが、結果が画面に表示されるまでに1分以上かかることがあります。これを行うより効率的な方法はありますか?
任意の助けは大歓迎です!
実際に生成されたSQLで、WP_Query
が使用しているものを見たいのですが、今のところは。
( http://wordpress.org/extend/plugins/debug-bar/ を使用すると、SQLクエリを簡単に表示できます)
「ランダム」で順序付けされたクエリは非効率的です。必要ない場合は削除してください。ランダムな順序が必要な場合は、それを削除してランダム化するためにPHPの shuffle
を使用することを検討してください。
LIKE
クエリもかなり非効率的です。可能であれば=
を使ってください。
Postmetaテーブルから投稿IDを取得する独自のクエリを作成してから、簡単なWP_Query
パラメータを指定してpost__in
を使用して投稿コンテンツを取得するほうが速い場合があります。これは助けになるかもしれないし、しないかもしれませんが、実験の価値があります。
IN
を使ったメタクエリを使うことでサーバから負荷を取り除くことができるかもしれません:
$the_query = new WP_Query(array(
'post_type' => 'listing',
'post_status' => 'publish',
'category_name' => 'private_rental',
'orderby' => 'Rand',
'meta_query' => array(
'key' => 'amenities',
'value' => $amenities,
'compare' => 'IN'
);
));
実行しようとしていたクエリは複雑なように見えます。そのため、サーバーに過度の負荷がかかる可能性があります。 IN
は基本的に、ユーザーが探しているフィールド内の値を持つキーamenities
のメタデータを持つすべての投稿を探します。間違いなくより効率的なクエリ、imho