WordPress でサイト運営しているとデータが溜まってきて、SQLクエリのパフォーマンスが落ちることがありますよね。
そういう時は、RDS の Performance Insights や、MySQL の スロークエリログ を駆使して、ボトルネックになっているクエリを特定する必要があります。
wp_postmeta.meta_value が検索条件に含まれる場合
例えば以下のようなクエリがボトルネックになっていると判明した場合
SELECT post_id, meta_value
FROM wp_postmeta
WHERE meta_key = '_wp_attached_file' AND meta_value = ?
これは attachment_url_to_postid() が発行しているクエリーです。
テーマやプラグインで、画像URLからポストIDを取得するために多発しているのかもしれません。
例えば以下のようなクエリがボトルネックになっていると判明した場合
SELECT wp_posts.ID
FROM wp_posts
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )
WHERE 1=1
AND ( wp_postmeta.meta_key = ? AND wp_postmeta.meta_value = ? )
AND wp_posts.post_type = 'post'
AND wp_posts.post_status = 'publish'
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0,10
これは Advanced Custom Fields プラグインなどを導入すると、発行されがちなクエリです。
これらのクエリは wp_postmeta
テーブルにレコードが増えると実行に時間がかかるようになります。
wp_postmeta
テーブルの meta_value
にはインデックスが貼られていないため WHERE
の中に meta_value
が存在するとクエリのパフォーマンスが落ちてしまいがちです。
この場合は、思い切って meta_value
にインデックスを貼ってしまうのも手です。
CREATE INDEX key_value
ON wp_postmeta(meta_key,meta_value(255));
wp_posts.guid が検索条件に含まれる場合
例えば、以下のようなクエリがボトルネックになっていると判明した場合
SELECT ID
FROM wp_posts
WHERE post_type = ?
AND guid = ?
これは S3 Uploads というプラグインが多く発行しているクエリーです。
attachment_url_to_postid()
と同様にメディアファイルのURLからポストIDを取得するために使用されています。
wp_posts
テーブルの guid
にインデックスが貼られていないために、パフォーマンス劣化の原因になることが多いです。
この場合も、思い切って guid
にインデックスを作成してしまいましょう。
CREATE INDEX type_guid
ON wp_posts(post_type,guid);
このように、ボトルネックになっているクエリを特定して対処することで、あなたの WordPress の速度改善が簡単に行えます。
また、RDSのインスタンスタイプを一つ落としてもちゃんと動くようになるかもしれません。