WordPressの「見えない重さ」を暴く:Query Monitorでデータベースの深淵を覗く
こんにちは。WordPressのコアを愛し、その挙動を日々追っているエンジニアです。
PHPや他のフレームワークからWordPressの世界に飛び込んできた皆さんが、最初に直面する壁。それは「なぜかサイトが重い」という現象ではないでしょうか。実は、WordPressのパフォーマンス低下の9割は、データベース(MySQL/MariaDB)への無駄なクエリ発行に起因します。
しかし、WordPressは巨大なブラックボックス。どのプラグインが、どのタイミングで、どんなSQLを投げているのか、普通は見えませんよね。
今回は、WordPressの内部構造を掌握するための最初の武器、「Query Monitor」の真髄と、それが暴き出す「クエリの最適化」について解説します。ここを理解すれば、あなたはもう脱・初心者です。
—
1. Query Monitorとは何か?「可視化」の重要性
Query Monitorは、単なるデバッグプラグインではありません。WordPressのライフサイクルにおける「実行トレース」をリアルタイムで出力する強力な診断ツールです。
WordPressがページを生成する際、内部では次のような処理が行われています。
1. init: プラグインの読み込み
2. template_redirect: どのテンプレートを表示するか決定
3. main_query: データベースから必要なデータを抽出
4. render: HTMLの生成
Query Monitorは、この各フェーズで発行されたSQLクエリの「実行時間」と「呼び出し元(Stack Trace)」を完璧に記録します。
導入方法
管理画面から「Query Monitor」をインストールし、有効化するだけです。画面上部のツールバーに、現在のデータベースクエリ数や実行時間が表示されます。
—
2. 「遅いクエリ」を特定する読み方
ツールバーをクリックすると、詳細なパネルが開きます。ここで見るべきは「Queries by Component」(コンポーネント別クエリ)という項目です。
- Component: どのプラグインやテーマがクエリを発行したか
- Query: 実際に実行されたSQL文
- Time: そのクエリの実行にかかったミリ秒
もし、特定のプラグインが「100回」も同じようなクエリを発行しているなら、それはN+1問題の典型です。
陥りやすい罠:N+1問題とは?
例えば、記事一覧で「各記事のカスタムフィールドを個別に取得する」コードを書くと、記事が10件あれば10回クエリが飛びます。
// 悪い例:ループ内で毎回SQLを発行している
foreach ($posts as $post) {
// get_post_metaは内部でSQLを叩くため、ループの数だけ負荷が増える
$value = get_post_meta($post->ID, ‘my_key’, true);
}
これを防ぐには、`get_posts`の引数で`update_post_meta_cache`を有効にするか、`WP_Query`の`meta_query`を適切に使い、一度のクエリでデータを吸い上げる設計(インデックスを活かしたクエリ)が必要です。
—
3. インデックスチューニングの第一歩
Query Monitorで発行されたSQLをコピーし、MySQLで `EXPLAIN` をつけて実行してみる習慣をつけましょう。
— Query MonitorからコピーしたSQLの先頭にEXPLAINをつける
EXPLAIN SELECT FROM wp_posts WHERE post_type = ‘product’ AND post_status = ‘publish’;
結果の `type` カラムに `ALL` と表示されていませんか?これは「テーブル全体を走査している」ことを意味します。もし `key` カラムが `NULL` なら、インデックスが効いていない証拠です。
開発者が意識すべき「インデックス」の基本
WordPressの `wp_posts` テーブルには、最初から `post_type` や `post_status` にインデックスが貼られていますが、カスタムフィールド(`wp_postmeta`)を多用すると、このインデックスが効きにくくなります。
- 教訓: 不要なメタデータを増やさないこと。
- 解決策: 高頻度で検索するデータは、カスタムテーブルを作成してインデックスを適切に設計する。
—
4. 最後に:WordPressをマスターするために
Query Monitorは、あなたが書いたコードが「システムにどのような負荷を与えているか」を教えてくれる鏡です。
初心者のうちは、「動けばいい」と考えがちですが、世界最高峰のエンジニアは「そのSQLがデータベースのインデックスを汚染していないか?」まで考えます。
1. Query Monitorを常に表示させておく
2. 自分の書いたコードが何回SQLを発行しているか数える
3. 「キャッシュ」を使ってSQL発行回数をゼロに近づける(`get_transient` や `wp_cache_set` を活用しましょう)
このサイクルを回すだけで、あなたのWordPressスキルは飛躍的に向上します。WordPressは決して重いCMSではありません。重くしているのは、無自覚なSQL発行なのです。
さあ、ツールを使って、その「見えない重さ」の正体を突き止めに行きましょう。応援していますよ!