web-dev-qa-db-ja.com

巨大なデータベースに対するクエリが遅い

私は25万人以上の投稿を持つ巨大なデータベースを持っています。私はできる限りの最適化をすべて実行し、インターネット上であらゆる可能な解決策を探しました。

私は私がカテゴリから最後の4つの記事を取得したい場所私はこのクエリを持っていると言うことができます:

$recent = new WP_Query(array( 'cat' => '8', 'posts_per_page' => '4')); 

どのQuery Monitorが次のものに変換されるか

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (8,9,10,11,12,13,14,15) )
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 4

そしてそれは1,4628秒かかります。

私の質問はなぜ私がphpmyadminに同じクエリを入れてこの行を変更した場合です:

AND ( wp_term_relationships.term_taxonomy_id IN (8,9,10,11,12,13,14,15) )

AND ( wp_term_relationships.term_taxonomy_id IN (8) )

クエリは2倍速くなります(0.5077秒) 。カテゴリIDである「8」のみを検索することになっているのに、なぜ他の分類IDを検索するのですか?どんなアドバイスでも大歓迎です。

ありがとうございました

1
John M.

@miloがコメントで述べたように、catパラメータ(および他の階層的分類法における同様のパラメータ)はクエリをサブカテゴリでも見せるようにします。そうしたくない場合は、category__inパラメーターを使用してください。

一般的な遅れについては、推測するのは難しいですが、それはあなたのDBサーバのパフォーマンス(おそらく一定の負荷がかかっていてそれをアップグレードする時が来ている)とテーブルのそれらの投稿の深さによって異なります。

最後に重要なことを言い忘れましたが、限界を超えて一致する結果がいくつあるかという情報が必要ない場合は、クエリに'no_found_rows' => trueを追加してみてください。そうすることで、DBはカテゴリ内の総投稿数(クエリのSQL_CALC_FOUND_ROWS部分)の計算を試みません。

0
Mark Kaplun