サーバー運用

MySQLクエリが遅い原因と改善方法

2026-05-05 読了6分 4PV
MySQLクエリが遅い原因と改善方法

こんにちは、AIシステムズです。
この記事は、代表コバが現場で対応してきたデータベース運用の知見をもとに、AIを活用して構成・執筆し、弊社にて最終チェックを行ったものです。

「サイトの特定ページだけ表示が遅い」「管理画面の一覧が開くのに10秒かかる」——その原因の大半はMySQLクエリのインデックス未使用やN+1問題です。サーバーのスペックを上げる前に、まずクエリの実行計画を見れば、コストをかけずに解決できるケースがほとんどです。

  • 遅いクエリを特定する方法
  • EXPLAINで実行計画を読む
  • インデックスの貼り方と落とし穴
  • WordPressサイトでよくある遅いクエリ
  • サーバー増強の前にやるべきこと

目次

  1. 遅いクエリの特定方法
  2. EXPLAINで実行計画を読む
  3. インデックスの設計
  4. WordPressサイトでよくある事例
  5. こういうサイトに向いている/向いていない
  6. 再発防止チェックリスト

遅いクエリの特定方法

最初にやるべきは、感覚ではなく数字で遅いクエリを特定することです。MySQLのスロークエリログを有効にします。

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

1秒以上かかるクエリをすべて記録し、mysqldumpslow で集計します。

mysqldumpslow -s t /var/log/mysql/slow.log | head -20

これで「合計実行時間が長いクエリTOP20」が出ます。チューニングはこのリストの上から順に取り組むのが最も効率的です。

EXPLAINで実行計画を読む

特定したクエリの先頭に EXPLAIN をつけて実行し、MySQLが内部でどう動くかを確認します。

EXPLAIN SELECT * FROM wp_posts WHERE post_status = 'publish' AND post_type = 'tips' ORDER BY post_date DESC LIMIT 10;

注目すべき項目は次の3つです。

  • typeALL なら全件スキャン(最悪)、refrange ならインデックス使用
  • rows:MySQLが読みに行く推定行数。何百万行になっているなら要対応
  • ExtraUsing filesortUsing temporary が出ていれば、ソート用のインデックスが足りない

typeALL でかつ rows が大きいクエリは、ほぼ確実にインデックスで改善できます

インデックスの設計

インデックスは「WHERE・ORDER BY・JOINで使うカラム」に貼ります。複数カラムを使う場合は複合インデックスを検討します。

CREATE INDEX idx_status_type_date
ON wp_posts (post_status, post_type, post_date);

複合インデックスは「左から順に使われる」のがポイントです。(A, B, C) のインデックスは、WHEREで A 単独、A AND BA AND B AND C なら使えますが、B 単独や B AND C では使えません。
落とし穴として、インデックスを貼りすぎるとINSERT・UPDATEが遅くなるため、使われていないインデックスは sys.schema_unused_indexes で定期的に確認して削除します。

WordPressサイトでよくある事例

弊社が中小企業のWordPress保守で対応してきた中で、特に多いのは次のパターンです。

  • wp_postmetameta_key + meta_value で検索しているが、meta_value がTEXT型でインデックスが効かない
  • カスタム投稿一覧で posts_per_page=-1(全件取得)が指定されていて、件数が増えると爆発的に遅くなる
  • プラグインが管理画面で wp_options の autoload を大量に追加し、毎ページの先頭で重いクエリが走る
  • ACFで多数のカスタムフィールドを使い、1ページの表示でwp_postmetaへ数百回SELECTが走る

最後のN+1問題は、get_field()get_fields()(複数フィールド一括取得)に置き換える、あるいは update_post_meta_cache() を呼んで一括キャッシュさせることで解消できます。

サーバー増強の前にやるべきこと

  • スロークエリログでTOP20を特定
  • EXPLAINで実行計画を確認
  • インデックスを追加または見直し
  • 不要なautoload、不要なプラグインを削減
  • 必要に応じてクエリキャッシュ・オブジェクトキャッシュを導入

この5つで多くの中小企業サイトは、サーバーのプランを上げずに体感速度が大きく改善します

こういうサイトに向いている/向いていない

このチューニング手法は、データ量が増えてきて表示が遅くなった中小企業のWordPressサイトや業務システムに直接効きます。月間PVが少なく、データも数百件レベルのサイトでは、ここまでの手間をかける必要はありません。

再発防止チェックリスト

  • スロークエリログが有効になっているか
  • 主要クエリにEXPLAINをかけた記録があるか
  • WHERE・ORDER BYで使うカラムにインデックスがあるか
  • 使われていないインデックスを定期的に棚卸ししているか
  • wp_options のautoloadサイズを定期的に確認しているか

まとめ

MySQLクエリの遅さは、サーバーのスペックではなくインデックスとクエリ構造で決まります。スロークエリログ→EXPLAIN→インデックス追加の流れを習慣にすれば、コストをかけずに体感速度を改善できます。

本記事は、代表コバが中小企業のデータベース運用の現場で対応してきた知見をもとに、AIを活用して構成・執筆し、弊社にて最終確認を行っています。サイトの表示速度改善、データベースチューニング、WordPress保守の見直しについて、具体的な状況をふまえた相談を承っています。費用感だけ知りたい方も、お気軽にご相談ください。

AI Systemsへの無料相談はこちら

「何から始めればいいか分からない」段階からでも、お気軽にご相談ください。
まずは、お話を聞かせていただくだけでも大丈夫です。

無料で相談する
コバ

コバ

AI活用 / Web制作 / 業務自動化支援

中小企業さま向けに「お手頃に・早く・成果が出る」開発支援を行っています。AI・Web・自動化の3分野を、まとめてサポートしています。

この記事をシェアする

一覧へ戻る