WordPressが“遅い本当の理由”はココだった:DBが外部かlocalhostかでTTFBが数秒変わる話(実測コード・数値つき)

「サーバーは速いはずなのに、TTFBがやたら重い(特にログイン時)…」
その違和感の正体は、WebサーバーとDB(MySQL)が同居しているかどうか=localhost かどうか にありました。今回は実際に往復遅延を測るPHPを用意し、ConoHa WING(DBが別ホスト) とエックスサーバー(localhost DB)でテストした実測値を公開します。結論から言うと、DBが外部ホストで平均実行時間が遅い環境の場合“クエリの回数 × 数十ms”の遅延が必ず積み上がるため、WordPressのTTFBを直撃します。


目次

要約(先に結論)

  • WordPressは1ページを表示する際に数百回のSQLを実行(テーマ・プラグイン次第で200回超は普通)。
  • DBが別ホスト(localhostでない)だと、1クエリあたり十数msの通信往復が積み上がり、TTFBが2〜3秒以上になりやすい。
  • DBがlocalhost(同一サーバー内。UNIXソケットやループバック)なら、1クエリあたり0.x〜数msで済み、その差は数百倍以上になる事も。
  • 非ログイン時は速いのに、ログイン時だけ遅いのは「静的ページキャッシュ(HIT時はDBに行かない)と、動的生成時(DBに行く)」の差。
  • 国内主要サーバーの多くは“DBが別ホスト”運用が多い。一方、エックスサーバーは最新契約であれば localhost を利用可能(弊社の契約でも確認)。
  • DBが別ホストの環境であっても平均クエリ実行時間が早いサーバー例(1ms未満)もありましたので、下記テストロジックを利用して、平均クエリ実行時間を測定してみる事をお勧めいたします。

テスト方法(PHPコードを公開)

1) 接続時間+「SELECT 1」往復遅延を測る最小テスト

<?php
// ワードプレスの「wp-config.php」(DBの設定箇所)を参考に下記を設定
$db_host = 'xxxxxxxxxxx';
$db_user = 'xxxxxxxxxxx';
$db_pass = 'xxxxxxxxxxx';
$db_name = 'xxxxxxxxxxx';

// 計測対象のクエリ
$query = "SELECT 1";   // シンプルなクエリ(通信遅延測定用)
$runs = 100;           // 実行回数

echo "=== MySQL クエリ速度テスト ===<br><br>";

// ----------------------
// 接続時間の計測
// ----------------------
$startConn = microtime(true);
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
    die("接続エラー: " . $conn->connect_error);
}
$endConn = microtime(true);
$connTime = ($endConn - $startConn) * 1000;
printf("MySQL 接続にかかった時間: %.3f ミリ秒<br><br>", $connTime);

// ----------------------
// クエリ実行テスト
// ----------------------
echo "テスト開始: {$runs} 回のクエリを実行します...<br>";

$totalTime = 0;
$minTime = PHP_FLOAT_MAX;
$maxTime = 0;

for ($i = 1; $i <= $runs; $i++) {
    $start = microtime(true);
    $conn->query($query);
    $end = microtime(true);

    $elapsed = ($end - $start) * 1000; // ミリ秒換算
    $totalTime += $elapsed;
    $minTime = min($minTime, $elapsed);
    $maxTime = max($maxTime, $elapsed);
}

$conn->close();

$avgTime = $totalTime / $runs;

// ----------------------
// 結果出力
// ----------------------
echo "<br>=== 計測結果 ===<br>";
printf("クエリ実行回数: %d 回<br>", $runs);
printf("最小実行時間: %.3f ミリ秒<br>", $minTime);
printf("最大実行時間: %.3f ミリ秒<br>", $maxTime);
printf("平均実行時間: %.3f ミリ秒<br>", $avgTime);
printf("合計実行時間: %.3f ミリ秒<br>", $totalTime);
printf("<br>※ 接続時間を含めた初回オーバーヘッド: %.3f ミリ秒<br>", $connTime);
echo "<br>テスト完了。<br>";
?>

使い方:上記を mysql_connect_test.php で保存し、同一サーバー上で実行。
平均実行時間($avgTime) が「1クエリ当たりの通信+応答の実測値」です。


実測結果

今回ご相談を受けたクライアント様の環境(DBが別ホスト)と弊社の環境(DBはlocalhost)とを比較しました。

ConoHa WING(同一ロジック)

  • 接続時間: 約 42.5 ms
  • 1クエリあたり平均: 約 13.9 ms
  • 100回合計: 約 1.39 秒
  • クライアント様の環境にて実際のクエリ数226回の合計:約3.14秒
    実際のTTFB値は、4秒台であったが、そのうち3秒程度はDBによる遅延と考えられる。

エックスサーバー(同一ロジック)

  • 接続時間: 約 0.33 ms
  • 1クエリあたり平均: 約 0.021 ms
  • 100回合計: 約 0.002 秒
  • クライアント様の環境にて実際のクエリ数226回をエックスサーバーだった場合に置き換えた合計:約0.047秒

差は桁違い
DBが外部だと「1クエリ=十数ms」かかる一方、localhost だと「1クエリ=0.02ms級」。
100回で 1.39秒 vs 0.002秒。この差が、そのまま動的生成時のTTFBに乗ります。

今回のクライアント様環境では、1ぺージを開くのに、226回のクエリが実行されていた為、約3.14秒のDB遅延が発生していると考えられるが、これをlocalhostのDBに置き換えると、約0.047秒という圧倒的な改善が期待できる。

※上記はDB遅延だけの差である為、その他の要因による遅延は勿論発生しますが、今回の場合、3秒以上の改善が十分に見込めると言えます。


なぜここまで差が出るのか?

  • WordPressは“動的生成”:1ページ表示で100〜300クエリは普通(テーマやプラグインで上下)。
  • DBが別ホスト1クエリあたり10〜15msの往復遅延 × クエリ回数 → 1〜3秒のTTFBを押し上げる。
  • DBがlocalhost1クエリ0.x〜数msで済む → 同じクエリ回数でも合計が数十msに収まる。

例)200クエリ × 13.9ms ≒ 2.78秒(通信遅延だけで)
同じ200クエリ × 0.021ms ≒ 約 0.0042秒

同じ200回のクエリを実行するのに、661倍の速度差が発生する!


ワードプレスの1ぺージあたりクエリ実行回数の目安

軽量構成(プラグイン少なめ・デフォルトテーマ)

1ページあたり 20〜50クエリ 程度

標準的な構成(プラグインも普通に利用)

1ページあたり 50〜150クエリ 程度

高機能構成/EC/多機能テーマ/プラグイン多数

1ページあたり 200〜300クエリ以上 も十分にあり得る

ざっくり目安(どのくらいの速度ならいいの?)

1クエリあたり平均時間のざっくり評価

平均クエリ時間評価ランク現実的な環境の想定備考
〜0.8ms🟢 極めて高速(理想)同一サーバー内DB(localhost / UNIXソケット)PHPとMySQLが同居。DBアクセス遅延がほぼゼロ。
0.8〜2ms🟢 高速同一ラック内、LAN接続DB(高品質共用サーバ)外部ホスト名でも実質ローカル級。WebとDBが同一DC内。
2〜5ms🟡 標準(良好)一般的な共用サーバー(内部ネットワーク分離あり)ページ数百件クエリでも遅延は体感ほぼ無し。
5〜10ms🟠 やや遅いWebとDBが別ホスト/VPS間通信/ネットワーク混雑時TTFBが大きくなる領域。
10〜20ms🔴 遅い遠隔DC/共用DB集中型/過負荷ノード今回のケース(13ms)はこの層。100クエリ超で TTFB が2〜3秒クラスに。
20ms〜🔴 非常に遅い(要対策)別リージョン・海外DC/ネットワーク制約/共用DB限界WordPress動的生成が体感レベルで重く感じる状態。

上記の表は、あくまでGPTによる推定のランク分けです。私のテストでは、localhostでないホスト設定の場合でも、1ms未満の環境もありました(恐らく同一ラック内など、近い距離にあると想定されますが)ので、そのような高速なクエリ実行が行えている環境であれば、当記事に書かれている内容を気にする必要はありませんが、実際に13msかかっている環境を確認したことも事実ですので、TTFBによる遅延に悩んでいて、原因が分からないと悩んでいる場合には、1クエリあたり平均時間を測定してみる価値はあるのではないかと思います。

サイト規模×平均クエリ時間ごとの「総DB時間」の目安

軽量構成(プラグイン少なめ・デフォルトテーマ)

平均クエリ時間20クエリ時50クエリ時評価
〜0.8ms約0.02秒約0.04秒超高速(DB遅延ほぼ無視可)
0.8〜2ms約0.02〜0.04秒約0.04〜0.10秒高速。キャッシュなしでも快適
2〜5ms約0.04〜0.10秒約0.10〜0.25秒標準的。微妙に遅延感じる程度
5〜10ms約0.10〜0.20秒約0.25〜0.50秒やや遅い。高速テーマで顕著
10〜20ms約0.20〜0.40秒約0.50〜1.00秒ページ遷移時に体感遅延発生

標準的な構成(プラグインも普通に利用

平均クエリ時間50クエリ時150クエリ時評価
〜0.8ms約0.04秒約0.12秒高速。理想的構成
0.8〜2ms約0.04〜0.10秒約0.12〜0.30秒良好。共用でも上位環境
2〜5ms約0.10〜0.25秒約0.30〜0.75秒標準的。体感的には普通レベル
5〜10ms約0.25〜0.50秒約0.75〜1.50秒やや遅い。TTFBに影響し始める
10〜20ms約0.50〜1.00秒約1.50〜3.00秒DBがボトルネックになる領域

高機能構成/EC/多機能テーマ/プラグイン多数

平均クエリ時間200クエリ時300クエリ時評価
〜0.8ms約0.16秒約0.24秒高速EC・大規模でも理想環境
0.8〜2ms約0.16〜0.40秒約0.24〜0.60秒高品質共用 or VPSで実現可能
2〜5ms約0.40〜1.00秒約0.60〜1.50秒標準的だがTTFB1秒超えが出始める
5〜10ms約1.00〜2.00秒約1.50〜3.00秒明確に体感遅い。
10〜20ms約2.00〜4.00秒約3.00〜6.00秒外部DBの典型。キャッシュ必須領域

GoogleはTTFB(Time to First Byte)の推奨値として200ミリ秒以下を掲げています。
200ミリ秒=0.2秒ですので、上記で0.2秒を超えている場合、DBの遅延だけで推奨値を上回っているという事になります。

「ログイン時は遅いのに、非ログイン時は速い」理由

  • 非ログイン(一般閲覧):多くのサーバーが静的ページキャッシュを使い、DBに行かない → TTFB 100〜200msが普通。
  • ログイン時(管理バー表示など)キャッシュ無効毎回動的生成DB往復が全部起きる → TTFB 2〜4秒に。

※非ログイン時に高速な場合であっても、キャッシュクリア後のタイミングなどでは同じく遅延すると考えられます。


重要:国内主要サーバーの“落とし穴”

  • 「超高速」を謳う共用サーバーでも、DBは別ホスト(外部)運用が多いのが現実。
  • つまり「キャッシュが当たれば速いが、動的生成は遅い」構成になりがち。
  • いっぽうでエックスサーバーは最新契約で localhost を利用可能(古いエックスサーバー契約では、別ホスト利用となっているようですが、新しい契約のエックスサーバーでは、弊社の契約でもlocalhostが利用出来る事を確認できています)。
    同じWordPressでもDBが同居しているだけでTTFBが根本から改善します。

※ “localhost” と明言していないサービスも多く、公式ページだけでは判別困難
実際には、契約してみてDBの接続情報を見てみるか、上記のPHPテストを置いて実測するのが最も分かり易いです。


どう選ぶ?どう改善する?

サーバー選定の優先順位

  1. DBがlocalhost(またはUNIXソケット)で使える構成であること

やむを得ず外部ホストDBのままなら

  • クエリ回数を減らす(不要な機能オフ、クエリ重複にトランジェントやオブジェクトキャッシュ)
  • ページキャッシュ(ログイン時以外のTTFBは劇的に下がる)
  • autoloadオプションの整理wp_postmeta のインデックス最適化

まとめ:WordPress の速度は“DBの距離”で決まる

  • DBが外部だと、1クエリ十数ms × 数百回 = 数秒のTTFBが“必ず”乗る。
  • DBがlocalhostなら、同じクエリ数でも合計は数十msに収まりやすい。
  • ログイン時だけ遅いのは、キャッシュ無効時にDB往復が露わになるから。
  • エックスサーバーの最新契約は localhost 利用が可能で、この点がWordPress運用の決定打になり得ます。

DBをlocalhostで使えるサーバー

WordPress を動的生成でも速く運用したい方は、DBをlocalhostで使える環境を最優先で。
現在、別ホストDB接続の環境で、平均クエリ実行時間が遅い環境の場合は、体感で差が出る可能性がかなり高まります。

👉 エックスサーバー公式
※上記URLよりお申込みいただいた場合、弊社からのご紹介リンクとなります。当記事が参考になりましたら上記よりお申込み頂けましたら幸いです。

弊社へのご相談もお待ちしております

TTFBが異常に遅いワードプレスサイトの調査・改善策のご提案承っております。22,000円~

結果的にサーバー移管が必要な場合には、サーバー移管の代行も可能です。33,000円~

自社(ご自身)でサーバー管理が不安な場合は、サーバーの保守管理、各種ご相談など、全て代行して承る事も可能です。月額:4,400円~

👉 お問い合わせフォームへ
お気軽にご相談くださいませ。


おまけ:計測ページをつくって比較してみよう

本記事のPHPを /mysql_connect_test.php に置く → 自分の環境の実測値を数字で可視化できます。
設置後、設置したURLへブラウザにアクセスして、値を確認してみてください。(下記のような画面が出ます)

上記画像の赤枠欄にて、10ミリ秒以上かかっている環境は要注意です。
ワードプレス環境の実行クエリ数によりますが、1秒以上、数秒程度のDB遅延が発生している可能性が高いです。

参考までにエックスサーバーにホストしている弊社のホームぺージにも同じロジックを設置していますので比べてみてください。
https://sieg-web.jp/wp/mysql_connect_test.php

目次