2026年7月1日
2026年7月1日
MySQLのクエリキャッシュの設定と注意点|8.0で廃止された理由と代わりの高速化策
MySQL のクエリキャッシュは、SELECT 文の結果をまるごと保存して、同じ文が来たときに再利用する機能です。ただし MySQL 8.0 で機能そのものが削除されており、今から MySQL で有効にすることはできません。MariaDB には残っていますが、既定では無効で、WordPress のように書き込みの多いサイトでは効果が出にくい機能です。この記事では、自分の環境でクエリキャッシュが使えるかの確認方法、MariaDB で使う場合の設定と効果の測り方、MySQL 8.0 への移行時の注意点、そして代わりに取り組むべき高速化策を説明します。
まず自分の環境を確認する
クエリキャッシュの扱いは、MySQL か MariaDB か、そしてバージョンによって大きく変わります。最初にサーバーの種類とバージョンを確認してください。
SELECT VERSION();
SHOW VARIABLES LIKE 'have_query_cache';
SHOW VARIABLES LIKE 'query_cache%';
結果の見方は次のとおりです(2026年10月現在)。
- MySQL 8.0 以降:クエリキャッシュは削除済み。query_cache_ で始まる変数自体が存在しない
- MySQL 5.7:5.7.20 で非推奨になったが、機能はまだ使える
- MariaDB:機能は残っている。10.1.7 以降は既定で query_cache_type が OFF になっている
レンタルサーバーやマネージドサービスでは、利用者が設定を変えられないことも多いので、変更できるかどうかも合わせて確認しておくと後の作業がスムーズです。
クエリキャッシュの仕組みと、効きにくい理由
仕組みを知っておくと、なぜ廃止されたのか、なぜ WordPress で効きにくいのかが理解しやすくなります。
文字列が一致しないとヒットしない
キャッシュのキーは SQL 文の文字列そのものです。空白や大文字小文字が少し違うだけでも別のクエリとして扱われます。また NOW() や RAND() のように実行のたびに結果が変わる関数を含むクエリは、キャッシュの対象外です。
テーブルに書き込むと、そのテーブルのキャッシュがすべて消える
あるテーブルに INSERT・UPDATE・DELETE が1件でも入ると、そのテーブルを参照しているキャッシュ済みの結果がすべて破棄されます。WordPress では、トランジェント(一時データ)の保存、投稿メタの更新、コメントやアクセス記録の書き込みなどが頻繁に起きるため、wp_options や wp_postmeta を参照するキャッシュはすぐに消えてしまいます。
同時アクセスが多いと、かえって遅くなる
クエリキャッシュは全体で1つのロックを使って管理されています。CPU のコア数が多く同時接続が多いサーバーほど、このロックの取り合いが起き、キャッシュを使わないほうが速いという状況になりがちです。MySQL が機能を削除した主な理由も、この拡張性の低さだと説明されています。
MariaDB でクエリキャッシュを使う場合の設定
MariaDB で読み込み中心のデータベース(更新が少ない社内システムなど)を扱う場合は、試してみる価値があります。WordPress の場合は、後で紹介する方法を先に検討するのがおすすめです。
設定を変える前に、設定ファイルのバックアップを取ってください。
[mysqld]
query_cache_type = 1
query_cache_size = 32M
query_cache_limit = 1M
各設定の意味は次のとおりです。
- query_cache_type:1 で有効、0 で無効、2 は SQL_CACHE ヒントを付けたクエリだけをキャッシュする
- query_cache_size:キャッシュ全体のサイズ。大きくするほど破棄の処理が重くなるため、数十 MB 程度までにとどめるのが一般的な考え方
- query_cache_limit:1つの結果として保存する最大サイズ。これを超える結果はキャッシュされない
サーバーを query_cache_type = 0 で起動していると、実行中に SET GLOBAL で有効化できない実装になっていることがあります。その場合は設定ファイルを変更してから再起動してください。
効果を数値で確認する
有効にしたら、しばらく運用してから状況変数で効果を確認します。
SHOW GLOBAL STATUS LIKE 'Qcache%';
SHOW GLOBAL STATUS LIKE 'Com_select';
見るべき値は次のとおりです。
- Qcache_hits:キャッシュから結果を返した回数
- Com_select:キャッシュにヒットせず、実際に実行された SELECT の回数
- Qcache_inserts:結果をキャッシュに保存した回数
- Qcache_lowmem_prunes:容量不足で古い結果を追い出した回数
- Qcache_not_cached:キャッシュの対象外だったクエリの数
ヒット率の目安は「Qcache_hits ÷(Qcache_hits + Com_select)」で計算できます。この値が低く、Qcache_inserts が Qcache_hits と同じくらい多いなら、保存してはすぐ捨てているだけで、オーバーヘッドしか生んでいない状態です。その場合は無効に戻したほうがよいでしょう。Qcache_lowmem_prunes が増え続けている場合でも、サイズを大きくする前に、そもそもヒットしているかを先に確認してください。
設定前後でページの応答時間やサーバーの CPU 使用率も比べ、体感ではなく数値で判断することが大切です。
MySQL 8.0 へ移行するときの注意点
MySQL 5.7 から 8.0 以降に移行するとき、古い設定ファイルに query_cache_type や query_cache_size が残っていると、未知の変数として扱われて MySQL が起動しないことがあります。移行の前に、設定ファイルから query_cache_ で始まる行を削除するかコメントアウトしてください。
# 設定ファイル内のクエリキャッシュ関連の行を探す(場所は環境に合わせて変更)
grep -rn "query_cache" /etc/mysql/ /etc/my.cnf /etc/my.cnf.d/ 2>/dev/null
アプリケーションのコードに SQL_CACHE や SQL_NO_CACHE といったヒントが書かれている場合も、8.0 では意味を持たないか、エラーの原因になることがあります。移行前にステージング環境で、主要な画面とバッチ処理が動くかを確かめてください。
WordPress で効果が出やすい代わりの高速化策
クエリキャッシュの代わりに、次のような方法を検討するほうが効果を得やすいです。上から順に、多くの WordPress サイトで効きやすいものを並べています。
ページキャッシュ
ページ全体の HTML を保存して返す方法です。データベースへの問い合わせそのものが発生しないため、匿名ユーザーが多いブログやメディアでは効果が大きくなります。キャッシュプラグインや、サーバー側(Nginx の FastCGI キャッシュなど)で実現できます。ログイン中のユーザーやカート画面などは対象外にする設定が必要です。
永続オブジェクトキャッシュ
WordPress は、取得したオプションや投稿の情報をリクエスト内でメモリに保持する仕組み(WP_Object_Cache)を持っています。Redis や Memcached と、それに対応したドロップイン(wp-content/object-cache.php)を組み合わせると、この結果をリクエストをまたいで再利用できます。Redis を使う場合は Redis Object Cache などのプラグインが広く使われています。クエリキャッシュと違い、データ更新時は WordPress 側が該当するキーだけを消すので、書き込みの多いサイトでも効果が残りやすいのが特徴です。
InnoDB バッファプールの見直し
InnoDB は、テーブルやインデックスのデータをメモリ上のバッファプールに保持します。innodb_buffer_pool_size が小さすぎると、毎回ディスクから読むことになり遅くなります。専用のデータベースサーバーならメモリの多くを割り当てるのが一般的ですが、Web サーバーと同居している場合は PHP などの分を残して決めてください。
遅いクエリそのものを直す
スロークエリログで時間のかかっているクエリを見つけ、EXPLAIN で実行計画を確認して、インデックスの追加やクエリの書き換えを検討します。プラグインが原因であることも多いので、どのプラグインが発行したクエリかを Query Monitor などで確認すると切り分けが早くなります。
まとめ
- MySQL 8.0 以降ではクエリキャッシュは削除されており、使えない
- MariaDB には残っているが既定では無効で、書き込みの多い WordPress では効果が出にくい
- 使う場合はサイズを控えめにし、Qcache_hits と Com_select からヒット率を計算して、効果がなければ無効に戻す
- MySQL 8.0 への移行前に、設定ファイルから query_cache_ の行を削除しておく
- WordPress の高速化は、ページキャッシュ、永続オブジェクトキャッシュ、バッファプール、遅いクエリの改善を優先する