【入門編】MySQLのクエリキャッシュとWordPressの内部キャッシュの相関関係 – WordPress 内部コア・データベース構造とパフォーマンス最適化解析バイブル

こんにちは。WordPressの深淵へようこそ。

WordPressをただの「CMS」として捉えているうちは、本当のパワーは見えてきません。WordPressは、データベースという「記憶」を、キャッシュという「反射」で高速化する、極めて高度なエンジンです。

今日は、多くの開発者がなんとなく使っている「データ取得」の裏側で、MySQLとWordPressがどう会話しているのか。その核心である「データベースとキャッシュの相関関係」を紐解いていきましょう。ここを理解すれば、あなたの書くコードは劇的に速くなります。

—

1. データベースの物理構造:`wp_posts` と `wp_postmeta` の関係

WordPressの心臓部である `wp_posts` テーブルは、投稿、固定ページ、カスタム投稿タイプを全て飲み込む巨大なコンテナです。

  • `wp_posts`: 記事のタイトルや本文など、共通の属性を保持。
  • `wp_postmeta`: 記事に付随する「カスタムフィールド」という個別の属性を、縦持ち(EAVモデル)で保持。

ここで重要なのは、「メタデータが必要なとき、WordPressは追加のJOINや個別クエリを投げる」という事実です。

陥りやすい罠:N+1問題

ループの中で `get_post_meta()` を呼び出すと、そのたびにMySQLへのクエリが発行されます。10件の記事を表示するだけで、データベースと11回も会話することになるのです。これがパフォーマンス低下の最大の要因です。

—

2. MySQLクエリキャッシュ vs WordPress Object Cache

ここが本日の核心です。二つの「キャッシュ」がどう協力し、時に競合するのかをイメージしてください。

MySQL クエリキャッシュ(物理層)

MySQL自体が持っている機能です。「同じSQL文が来たら、計算せずに結果を返す」という仕組みですが、実は最新のMySQL 8.0では廃止されています。 なぜなら、テーブルが更新されるたびにキャッシュがすべて無効化され、むしろオーバーヘッドが大きすぎるからです。

WordPress Object Cache(アプリケーション層)

WordPressがメモリ(RedisやMemcachedなど)を活用してデータを保持する仕組みです。

  • `wp_posts` からデータを一度取得したら、その結果をメモリ上に保存。
  • 次回同じIDの投稿が必要なときは、MySQLにすら行かず、メモリから直接取得します。

—

3. 実践:どうすれば「爆速」を実現できるのか?

開発現場で最も重要なのは、「いかにMySQLへのクエリを減らし、Object Cacheを有効活用するか」です。

悪い例:ループ内で個別取得

$posts = get_posts([‘post_type’ => ‘product’]);
foreach ($posts as $post) {
// 毎回データベースに問い合わせが発生!
echo get_post_meta($post->ID, ‘price’, true);
}

良い例:Object Cacheの恩恵を受ける

WordPressには `get_posts` 実行時に、関連するメタデータを一括でキャッシュする仕組みがあります。

$args = [
‘post_type’ => ‘product’,
‘update_post_meta_cache’ => true, // これが重要!
‘update_post_term_cache’ => true,
];

$posts = get_posts($args);

// すでにキャッシュされているため、データベースへの追加アクセスはゼロです
foreach ($posts as $post) {
echo get_post_meta($post->ID, ‘price’, true);
}

—

4. 押さえておくべき「キャッシュの更新」という作法

キャッシュは魔法ではありません。「更新」を忘れると、古い情報が残り続けます。

WordPressには `clean_post_cache($post_id)` という関数があります。投稿が更新された際に、この関数が自動的に呼ばれ、Object Cacheが破棄されます。これにより、次のアクセスで最新のデータがMySQLから再取得されるわけです。

ここをマスターするためのチェックリスト

1. `WP_Query` を使う: `get_posts` や `WP_Query` は、内部で適切にキャッシュを管理しています。生SQL(`$wpdb->get_results`)を投げると、キャッシュの恩恵をすべて自分で実装しなければなりません。
2. `transient API` を活用する: 複雑な計算結果や、外部APIのレスポンスは `set_transient()` で保存しましょう。これがObject Cacheの「手動管理版」です。
3. Redisを導入する: 標準のObject Cacheはプロセスが終わると消滅します。永続化可能な Redis をバックエンドに指定するだけで、サイトの応答速度は劇的に向上します。

—

最後に:エンジニアとしての視座

データベースとキャッシュの関係を理解することは、「システムに無駄な仕事をさせない」という哲学を学ぶことと同じです。

MySQLという重厚な図書館へ毎回本を探しに行くのではなく、手元のデスク(Object Cache)に資料を置いておく。この意識を持つだけで、あなたのコードは「ただ動くもの」から「洗練されたシステム」へと進化します。

ここをクリアすれば、WordPress開発の景色は一変します。さあ、次はどの深淵を覗いてみましょうか? 応援していますよ!

タイトルとURLをコピーしました