Skip to content

cosicosilife.com

ライフハックについていろいろ書きます

Primary Menu
  • サイトマップ
  • クラウド技術
  • 安全資産投資
  • 旅行
  • ライフハック
  • プライバシーポリシー
  • 運営者情報とご連絡先
  • Home
  • 未分類
  • Wordpress でMysql のクエリが遅い場合
  • 未分類

WordPress でMysql のクエリが遅い場合

david 2025年2月10日

今回はDbeaver をクライアントとして使ってみた。allowPublicKeyREtrieval がFALSEになっている。。。。。これでエラーで接続できなかったので、True にしておいた  

参照URL  https://donbura.hatenablog.com/entry/20240516_dbeaver_error

この記事の目次(クリックしたらジャンプ)

Toggle
  • 1. クエリの実行計画を確認する(EXPLAINの活用)
  • 2. スロークエリログの有効化
  • 3. インデックスの確認・最適化
  • 4. wp_optionsテーブルの負荷を軽減する
  • 5. プラグイン・テーマの影響を調査する
  • 6. クエリキャッシュの活用 結局これだったのかも。。。
  • 7. キャッシュプラグインの導入
  • 8. データベースの分割やアーキテクチャの見直し
  • 9. サーバーのリソースを確認する
  • 10. MySQLのアップグレード

1. クエリの実行計画を確認する(EXPLAINの活用)

WordPressでクエリが遅い原因を特定するには、MySQLのEXPLAINコマンドを活用して、クエリの実行計画を確認します。
例えば、WordPressではプラグインやテーマが複雑なクエリを実行していることが多いため、それらのクエリを特定します。

具体例:

EXPLAIN SELECT * FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish';
  • 「type」がALLの場合、フルテーブルスキャンが発生している可能性があり、インデックスの最適化が必要です。

2. スロークエリログの有効化

MySQLのスロークエリログを有効にして、遅いクエリを特定します。

スロークエリログの設定方法:

slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1

実際にいれてみる

bash-5.1# echo -e "\n[mysqld]\nslow_query_log = 1\nslow_query_log_file = /var/log/mysql/slow.log\nlong_query_time = 1" |  tee -a /etc/my.cnf

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
bash-5.1# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/9.0/en/server-configuration-defaults.html

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

3. インデックスの確認・最適化

WordPressでは、特に以下のようなテーブル(例:wp_posts, wp_postmeta, wp_options)がパフォーマンスのボトルネックになりやすいです。
頻繁に使用されるクエリのWHERE句やJOIN句に利用されている列にインデックスを追加することで、クエリを高速化できます。

インデックスの追加例:

ALTER TABLE wp_postmeta ADD INDEX meta_key_meta_value (meta_key, meta_value(255));

注意:

  • WordPressではデータ量が多いとwp_postmetaテーブルがパフォーマンスの問題を引き起こすことが多いため、特にこのテーブルの最適化を検討します。

4. wp_optionsテーブルの負荷を軽減する

WordPressではwp_optionsテーブルにキャッシュデータや設定データが保存されます。このテーブルが肥大化すると、クエリが遅くなる原因となります。

対策:

  • 不要なオプションデータ(特にautoloadがyesのもの)を削除します。
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';
  • 不要なプラグインを無効化し、不要なオプションを削除します。

5. プラグイン・テーマの影響を調査する

遅いクエリの多くはプラグインやテーマによって引き起こされることがあります。

具体的な手順:

  1. プラグインの無効化
    すべてのプラグインを無効にし、1つずつ有効化して、どのプラグインが原因となっているか特定します。
  2. デバッグモードを有効化
    WordPressのwp-config.phpでデバッグモードを有効にしまする
  3. define('SAVEQUERIES', true); define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); これにより、遅いクエリをデバッグログ(wp-content/debug.log)で確認できます。  >>>>WP_DEBUGは有効な手段ではあるが、DBの遅延にのトラシューには使ったことがないな。次回何か機会があったらやってみようと思う。

6. クエリキャッシュの活用 結局これだったのかも。。。

MySQL 5.6ではクエリキャッシュを利用できますが、環境によっては設定が無効になっている場合があります。

設定例:

  1. MySQL設定ファイル(my.cnf または my.ini)に以下を追加query_cache_type = 1 query_cache_size = 64M
  2. MySQLを再起動して適用します。

以前顧客のテーブルが大きいときに、一度select * で全文検索したら、そのあとにクエリの速度が改善したのを覚えている。これはキャッシュを利用していたからであろう。ただ、それが本当に原因であったのかについては いまとなっては、検証できない

その時使ったコマンドは SHOW STATUS LIKE ‘Qcache%’; だったと思う<<当時もググっていた

Variable_name           | Value |
+-------------------------+-------+
| Qcache_hits             | 200   |
| Qcache_inserts          | 150   |
| Qcache_lowmem_prunes    | 10    |
| Qcache_not_cached       | 50    |
| Qcache_queries_in_cache | 75    |
| Qcache_total_blocks     | 300  

Qcache_hits: クエリキャッシュにヒットした回数。
Qcache_inserts: クエリがキャッシュに挿入された回数。
Qcache_not_cached: キャッシュされなかったクエリ数(キャッシュ対象外など)。
Qcache_lowmem_prunes: メモリ不足でキャッシュが削除された回数。

Qcache_hits: がビシバシ増加していた。。。。。と記憶している。。。記憶は定かではない。最新のMysql では確かめられないので、時間があるときに確認してみよう


7. キャッシュプラグインの導入

WordPressでは、データベースの負荷を軽減するためにキャッシュプラグインを活用するのも有効です。
おすすめのプラグイン:

  • WP Super Cache
  • W3 Total Cache
  • LiteSpeed Cache(LiteSpeedサーバーを利用している場合)

これらのプラグインを利用することで、ページキャッシュやデータベースクエリのキャッシュを簡単に実現できます。


8. データベースの分割やアーキテクチャの見直し

データが大量に増加している場合、以下の方法を検討します:

  • データベースのアーカイブ(古いデータを別テーブルまたは別のデータベースに移動)。
  • 読み取り専用クエリをレプリカ(リードレプリカ)で処理するように構成。

9. サーバーのリソースを確認する

オンプレ環境では、サーバーのリソース(CPU、メモリ、ディスクI/O)の確認も重要です。

  • リソースが不足している場合、サーバーのアップグレードを検討します。
  • ストレージがHDDの場合、SSDに変更することでディスクI/Oを大幅に改善できます。

10. MySQLのアップグレード

MySQL 5.6は古いバージョンのため、MySQL 5.7や8.0へのアップグレードを検討します。これにより、より高度な最適化機能やインデックスアルゴリズムが利用可能になります。

Continue Reading

Previous: 完全初心者向けWhisper文字起こしガイド:MP3からテキスト変換の極意
Next: AWS cloudformation とbeanstalk でアプリ作成

Related Stories

image
  • 未分類

Twilio Elastic SIP Trunking を試す

david 2025年2月22日
aws
  • 未分類

AWS SSM を使ってみよう 

david 2025年2月16日
DNS
  • 未分類

【初心者向け】AWS Route 53 で cosicosilife.org に DNSSEC を設定する方法

david 2025年2月10日
  • argocdの導入
  • (タイトルなし)
  • オンプレUbuntuでHelm中心にKubernetes運用・CI/CD構築
  • Ubuntu上にArgo CDをインストールし、ブラウザアクセスできるようにする手順(k8s.cosicosilife.com対応)
  • 【初心者向け】Argo CD に初めてのアプリケーションをデプロイしてみよう!
  • サイトマップ
  • クラウド技術
  • 安全資産投資
  • 旅行
  • ライフハック
  • プライバシーポリシー
  • 運営者情報とご連絡先
  • サイトマップ
  • クラウド技術
  • 安全資産投資
  • 旅行
  • ライフハック
  • プライバシーポリシー
  • 運営者情報とご連絡先
Copyright © Cosicosilife | MoreNews by AF themes.