私は8000以上の投稿があるWordPressサイトを持っています、そして私が新しいものを追加する度にそのサイトは反応しなくなります。私はMySQLのスロークエリログをチェックし、それがpostsテーブルのほとんどの行を返すselectを実行しており、実行するのに長い時間がかかっていることを知りました。
これは一例です。
Query_time: 149.702704
Lock_time: 0.000078
Rows_sent: 4699
Rows_examined: 9398
Rows_affected: 0
Rows_read: 4699
use 488726_wp;
SELECT `ID`, `post_author`, `post_date`, `post_date_gmt`, `post_status`, `post_name`, `post_modified`, `post_modified_gmt`, `post_parent`, `post_type`
FROM `wp_posts`
WHERE ( (post_status = 'publish' AND (post_type = 'post' OR post_type = ''))
OR (post_status = 'publish' AND post_type = 'page') )
AND post_password=''
ORDER BY post_modified DESC;
これらのクエリの出所はどうすればわかりますか?
データベースクエリのパフォーマンスをチェックするには、このプラグイン http://wordpress.org/extend/plugins/debug-queries/ を使用してください。ここには、行われたすべてのクエリと、そのクエリが完了するのに必要な時間、およびページ全体を作成するのに必要な時間についての詳細がたくさん表示されます。
あなたがしたいことは、このようにクエリに対してEXPLAINを実行することです。
EXPLAIN SELECT ID, post_author, post_date,
post_date_gmt, post_status, post_name,
post_modified, post_modified_gmt, post_parent,
post_type FROM wp_posts
WHERE ( (post_status = 'publish' AND (post_type = 'post' OR post_type = ''))
OR (post_status = 'publish' AND post_type = 'page') )
AND post_password='' ORDER BY post_modified DESC;
これにより、MySQLが採用しているアクセスパターンが必要なデータを収集していることがわかります。
しかし、WHERE句とORDER BY句を検討するだけで、次のような提案をしたいと思います。クエリを高速化するのに役立つインデックスを作成します。 post_statusとpost_typeはクエリ内で静的な値を持ち、post_modifiedはそれら二つのカラムのソート順を提示するので、このインデックスを試してください:
ALTER TABLE wp_posts ADD INDEX (post_status,post_type,post_modified);
試してみる !!!
この問題はGoogle XMLサイトマッププラグインに関連しています。 http://wordpress.org/support/topic/plugin-google-xml-sitemaps-performance-issues-on-large-wp_posts-tables
「GETリクエストによる手動サイトマップ構築を有効にする」オプションを使用できます。手動で生成の進行状況をトリガーします。
次のプラグイン、 Query Interface を試してみてください。クエリを表示できるだけでなく、インデックスまたは説明をチェックすることでクエリが何を行っているのかを確認できるインターフェースも提供されます。