LoginSignup
17
20

More than 5 years have passed since last update.

参照メインのWordpressの場合はMySQLのクエリキャッシュを有効にすると幸せになるかもしれない

Posted at

wordpressで技術的な内容をググろうと思うと難しくないっすか??
pluginの使い方とかがいっぱい出てきますが、違う!!
「俺が欲しいのはそんな情報じゃねーーーー!!!」ってよく思います。

wordpressで参照メインのサイトに MySQLのクエリキャッシュを導入したら
幸せになれたのでその時の備考メモ

環境

  • wordpress 4.5.3
  • MySQL 5.5
  • Amazon RDS db.m3.large

参考情報

generalログをみたらわかる小・中規模向けのCMSなwprdpress

実際は大規模でもそれなりきっと運用はできると思いますが、結構大変なイメージです。

トップページでのgeneralログをみてましょう。
(一部抜粋)

          105 Query SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'uninstall_plugins' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'ewww_image_optimizer_debug' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'ewww_image_optimizer_noauto' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'ewww_image_optimizer_webp_for_cdn' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'wpseo_onpage' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'ure_role_additional_options_values' LIMIT 1
          105 Query SELECT wp_redirection_items.*,wp_redirection_groups.position AS group_pos FROM wp_redirection_items INNER JOIN wp_redirection_groups ON wp_redirection_groups.id=wp_redirection_items.group_id AND wp_redirection_groups.status='enabled' AND wp_redirection_groups.module_id=1 WHERE (wp_redirection_items.regex=1 OR wp_redirection_items.url='/')
          105 Query select ID from wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) where ( wp_postmeta.meta_key = "index_ad" AND CAST(wp_postmeta.meta_value AS CHAR) = "1") and post_status = "publish"
          105 Query SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.ID NOT IN (88962,89034) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish')  ORDER BY wp_posts.post_date DESC LIMIT 0, 15
          105 Query SELECT FOUND_ROWS()
          105 Query SELECT wp_posts.* FROM wp_posts WHERE ID IN (92217,66743,21109,40658,26741,28233,40586,68212,35424,16449,14599,26698,19259,10428,10411)
          105 Query SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id  WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format', 'supervisor') AND tr.object_id IN (10411, 10428, 14599, 16449, 19259, 21109, 26698, 26741, 28233, 35424, 40586, 40658, 66743, 68212, 92217) ORDER BY t.name ASC
          105 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (10411,10428,14599,16449,19259,21109,26698,26741,28233,35424,40586,40658,66743,68212,92217) ORDER BY meta_id ASC
          105 Query SELECT * FROM wp_users WHERE ID = '38'
          105 Query SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (38) ORDER BY umeta_id ASC
161109 16:47:38   105 Query SELECT wp_posts.* FROM wp_posts WHERE ID IN (92227,66873,22008,41707,31493,31400,40894,91872,89992,88478,14822,31198,87864,42795,55608)
          105 Query SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (14822,22008,31198,31400,31493,40894,41707,42795,55608,66873,87864,88478,89992,91872,92227) ORDER BY meta_id ASC
          105 Query SELECT * FROM wp_users WHERE ID = '26'
          105 Query SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (26) ORDER BY umeta_id ASC
          105 Query SELECT * FROM wp_users WHERE ID = '3'
          105 Query SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (3) ORDER BY umeta_id ASC
          105 Query SELECT * FROM wp_users WHERE ID = '20'
          105 Query SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (20) ORDER BY umeta_id ASC
          105 Query SELECT * FROM wp_users WHERE ID = '12'
          105 Query SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (12) ORDER BY umeta_id ASC
          105 Query SELECT * FROM wp_users WHERE ID = '30'
          105 Query SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (30) ORDER BY umeta_id ASC
          105 Query SELECT * FROM wp_users WHERE ID = '23'
          105 Query SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (23) ORDER BY umeta_id ASC
          105 Query SELECT * FROM wp_users WHERE ID = '4'
          105 Query SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (4) ORDER BY umeta_id ASC
          105 Query SELECT option_value FROM wp_options WHERE option_name = '_transient_timeout_ga_ranking_30_3000' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = '_transient_ga_ranking_30_3000' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = '_transient_timeout_ga_ranking_all_2016-11-09' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = '_transient_ga_ranking_all_2016-11-09' LIMIT 1
          105 Query SELECT CONCAT('/', meta_value) as meta_value, post_id FROM wp_postmeta WHERE meta_key = 'custom_permalink'
          105 Query SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'uninstall_plugins' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'ewww_image_optimizer_debug' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'ewww_image_optimizer_noauto' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'ewww_image_optimizer_webp_for_cdn' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'wpseo_onpage' LIMIT 1
          105 Query SELECT option_value FROM wp_options WHERE option_name = 'ure_role_additional_options_values' LIMIT 1

これは抜粋したので一部です。

結構おおう・・・・って感じになりますよね・・・・

でもよーく見てましょう。
似たSQLを毎回発行しているのがわかりますよね???
そこで特にpluginのロードとかはほぼ固定でselectしていますよね。

そこでMysqlのオプション設定できる query_cacheを設定したら大分マシになるんじゃね?と思い設定してみました。

設定の前に

今のwordpressで運用しているサイトは参照が9割のサイトです。
例えばユーザーコメントとかが活発なサイトとかだと、キャッシュ更新の
頻度が上がって逆効果にもなりますのでご注意ください。
(あんまり更新が頻繁なwordpressのサイトも聞いたことないけども)

設定方法

MySQL

/etc/my.cnf
[mysqld]
.
.
.
query_cache_size = 512M

これだけ

RDS

パラメーターグループをdefautl以外で設定していないと設定できないので注意してください

  • RDS パラメーターグループの設定項目までいって編集
    • 自動化したいならaws-cliをつかってよしなに

下記の項目を追加

query_cache_limit  [バイト数]
query_cache_size   [バイト数]

これだけです。
適用タイプがdynamicなので無停止で反映できます。

パラメーターはメモリの2割位を割り当てました。

適用してみた

今までCPU使用率が 30-45%程度で推移していたのが一気に10%以下に

RDS

最後に

wordpressは結構アホみたいにSQLを発行します。
無駄なクエリはキャッシュさせることによってDB側の負荷を下げることができたりします。

ただしUPDATEを頻繁に行うサイトでは逆にパファーマンスは落ちるので注意してください。

17
20
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
17
20