11
12

More than 3 years have passed since last update.

[WordPress][MySQL] クエリパフォーマンスが落ちてきたときに設定すると良いインデックス

Last updated at Posted at 2021-07-13

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のインスタンスタイプを一つ落としてもちゃんと動くようになるかもしれません。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12