2017-01-14 10 views
-4

私はWordPressサイトに保存しようとしています。それができるかどうかを確認するために100万件以上の投稿をチェックしています。インポートが結果を投稿1000000+した後、ウェブサイト、である:70ポスト(index.phpを)とアーカイブのメインクエリは約1,60秒投稿数100万回のWordPressで、それを最適化する方法

を必要と

ので、私は、クエリのデバッグを開始し、これが標準ですクエリ:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
WHERE 1=1 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' 
OR wp_posts.post_status = 'private') 
ORDER BY wp_posts.post_date DESC 
LIMIT 1035930, 70 

私はチェックのためにこのクエリを操作し始めました。必要ORDER BY wp_posts.post_date DESCORDER BY IDにクエリを渡すと

  • :私はこの後、私たちはこのトリックを持つ唯一の0,40秒

    SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
    FROM wp_posts 
    WHERE 1=1 
    AND wp_posts.post_type = 'post' 
    LIMIT 1035930, 70 
    

    を必要とし、このようなクエリをチェックして、私の要件とそれを最適化することができます1,20秒(0、40は第二獲得)

  • ORDER BYクエリを削除する場合は、1秒(0,20は、第二獲得)

  • を必要
  • 私は0,40秒(0,60が第二稼いだ)

を必要ととても巨大条件は「post_status」必要はないで私のプロジェクトにpost_statusORDER BY

あるAND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')クエリを削除する場合それを削除できますか?

ORDER BYでは、代わりにmysqlをPHPで置き換えることができますか?私はPHPをより速く、右を学んだか?

どのように私はまだこのクエリを改善することができますか?

その後、私は

add_filter ('posts_orderby', 'bm_featureHomeFilterOrder'); 

    function bm_featureHomeFilterOrder ($order = '') { 
     global $wpdb; 
     $order = 'none'; 
     return $order; 
    } 

ではなく、「なし」と連携することにより削除順序のためにこのコードを使用しようとした最速の問合せ、例えば、メインクエリを置き換えることができますどのように、IDのような他の変数でのみ動作します-titleなど

pre_get_postを使用してネイティブmysqlクエリを使用して削除できますか?

のように:

  • PHP 7 FPM
  • madiadb
  • memcachedの(データベースキャッシュとオブジェクトキャッシュ)
  • APC
  • $query = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
    FROM $wpdb -> wp_posts 
    WHERE 1=1 
    AND wp_posts.post_type = 'post' 
    LIMIT 12080, 70"); 
    

    ウェブサイトがこの構成でホストされています

  • NGINX
  • mysqltunerでチューニングされたmariadb設定。

この設定はeasyengineスクリプトによって行われます。

使用中のテーマは、index.phpページ

(画像のみ+タイトルを紹介)されたアーカイブで検索したデータのためのより多くの情報のためのコードスターターテーマhttps://underscores.me/チェックです。

シングルポストで取得されたデータは(タイトル、カテゴリ、コンテンツ、25関連の投稿)です。

+0

クエリの日付によるソートには時間がかかり、並べ替えを行わず、ランダムな行を70個だけ戻して最適化します。はい、元のクエリとは関係ないこのような最適化がさらにあります。 – Solarflare

答えて

0

LIMIT 1035930, 70は、パフォーマンスキラーです。あなたが望む70点を得るには、1035930 + 70行をスキャンする必要があります。

残念ながら、SQL_CALC_FOUND_ROWSが必要です

あなたは、単にテーブルを歩いている場合は、ここでは2つの文書が読みになっていますスキャン全体を完了します。これは、おそらく、100万行のスキャンです。 正確なの数を見つける価値があるかどうかについて実際に2度考えなければなりません。結局のところ、検索エンジンは最初に「123,000以上のヒット」に行き、「役に立たない」数字を一斉に放棄しました。

私の提案を実装した後でもまだ問題がある場合は、修正されたクエリであるSHOW CREATE TABLEEXPLAIN SELECT ...で新しい質問を開始してください。 (私はWPスキーマについて多くの賛辞を持ちますが、いくつかはユースケースに当てはまるかもしれません)。WPは、偶然の使用のために設計されたもので、百万行の使用を得るために役立つ必要があります。

+0

あなたの役に立つリンクをありがとう。 SQL_CALC_FOUND_ROWSのために私はmemcachedに格納されて行く初めてのロードページの後を参照してください、高いリソース(私は0.0001秒を参照してください)を必要としないので、あなたは他の問題の原因と考える? – themich

+0

Memcachedは 'SELECT'の前のキャッシュです。しかし、 'SELECT'を実行する必要がある場合、' SQL_CALC_FOUND_ROWS'はそれを遅くします。 –

関連する問題