2026年7月4日

2026年7月4日

MariaDBのクエリキャッシュ設定方法とMySQL 8.0での代わりの手段

クエリキャッシュは、SELECT 文とその結果をメモリに保存し、まったく同じ文が来たときにテーブルを読まずに結果を返す仕組みです。ただし2026年10月時点で、使える環境は限られています。

  • MySQL: クエリキャッシュは 5.7.20 で非推奨になり、MySQL 8.0 で削除されました。8.0 以降に query_cache_type などの変数はありません。
  • MariaDB: 機能は残っていますが、既定で無効(query_cache_type = OFF)です。MariaDB の公式ドキュメントは、多コアのサーバーではロック待ちの悪影響が利点を上回ることが多いとして、有効化を勧めていません。

この記事では、まず自分のデータベースで使えるかを確かめ、MariaDB で試す場合の設定と効果の測り方、WordPress で代わりに使うべきキャッシュを説明します。

使っているデータベースを確認する

SELECT VERSION();
SHOW VARIABLES LIKE 'have_query_cache';
SHOW VARIABLES LIKE 'query_cache%';
  • VERSION() が 8.0.x 以降の MySQL なら、クエリキャッシュは存在しません(SHOW VARIABLES LIKE 'query_cache%' は空の結果になります)。この場合は後半の「WordPressで代わりに使うキャッシュ」へ進んでください。
  • 10.x-MariaDB や 11.x-MariaDB と表示され、have_query_cache が YES なら設定できます。

クエリキャッシュの仕組みと制限

設定する前に、効く場面と効かない場面を押さえておきます。

  • 文字列として一字一句同じクエリにしか当たりません。空白やコメントが違うだけでも別のクエリとして扱われます。
  • テーブルに書き込みがあると、そのテーブルを使うキャッシュ結果はすべて破棄されます。古い結果が返ることはありませんが、更新の多いテーブルではほとんど当たりません。
  • NOW()・RAND()・UUID() などの非決定的な関数を含むクエリ、一時テーブルを使うクエリ、ユーザー変数を使うクエリ、SELECT ... FOR UPDATE などはキャッシュされません。
  • 参照も登録も一つのロック(ミューテックス)を順番に取るため、同時接続が多いと待ちが発生します。

WordPress はコメント・投稿の更新、wp_options のトランジェント書き込みなどで頻繁にテーブルを書き換えるため、クエリキャッシュの当たり率は上がりにくい傾向があります。設定後は次の「効果を測る」で数値を見て判断してください。

MariaDBでクエリキャッシュを有効にする

一時的に試す(再起動で元に戻る)

MariaDB では、起動時に無効でも実行中に有効化できます。

SET GLOBAL query_cache_size = 67108864;   -- 64MB
SET GLOBAL query_cache_type = ON;
SHOW VARIABLES LIKE 'query_cache%';

query_cache_size は 1024 の倍数に切り捨てられます。小さすぎる値を指定すると割り当てに失敗し、サイズが 0 になります(警告が出ます)。

設定ファイルで恒久化する

Debian / Ubuntu の MariaDB パッケージでは /etc/mysql/mariadb.conf.d/50-server.cnf の [mysqld] セクションに書きます(RHEL 系では /etc/my.cnf.d/mariadb-server.cnf など。配置はディストリビューションで異なります)。

[mysqld]
query_cache_type = 1
query_cache_size = 64M
query_cache_limit = 1M
sudo systemctl restart mariadb

各変数の意味は次のとおりです。

変数 意味
query_cache_type 0(OFF)=使わない、1(ON)=キャッシュできるものはすべて保存(SQL_NO_CACHE を除く)、2(DEMAND)=SQL_CACHE を付けたクエリだけ保存
query_cache_size クエリキャッシュ全体に割り当てるメモリ量
query_cache_limit 1件の結果としてキャッシュできる最大サイズ。これより大きい結果は保存しない
query_cache_min_res_unit 結果を保存するブロックの最小単位。小さいと断片化とロックが増え、大きいとメモリの無駄が増える
query_cache_strip_comments 照合前にコメントを取り除く(コメントだけ違うクエリを同じものとして扱う)

クエリキャッシュには有効期限を決める変数(query_cache_expiry のようなもの)はありません。保存した結果は、テーブルの更新とメモリ不足でだけ結果が捨てられます。

サイズは大きくすれば良いわけではありません。大きすぎると結果の破棄やロック待ちの負担が増えることがあるため、数十MB程度から始めて、次の数値を見て調整します。

効果を測る

SHOW GLOBAL STATUS LIKE 'Qcache%';
ステータス変数 意味
Qcache_hits キャッシュから結果を返した回数
Qcache_inserts キャッシュに登録した回数
Qcache_not_cached キャッシュできなかったクエリの数
Qcache_lowmem_prunes メモリ不足で古い結果を捨てた回数
Qcache_free_memory 空いているメモリ量
Qcache_queries_in_cache 保存されているクエリの数
Qcache_free_blocks / Qcache_total_blocks 空きブロック数 / 全ブロック数。空きの割合が大きいと断片化している

判断の目安:

  • Qcache_hits が Qcache_inserts より十分に多くなければ、登録の手間ばかりかかっています。無効に戻すことを検討します。
  • Qcache_lowmem_prunes が増え続けるなら、サイズが足りないか、キャッシュに向かない負荷です。
  • 有効化の前後で、ページの応答時間やスロークエリの件数を比べてください。数値が改善しない、または悪化するなら無効に戻します。

キャッシュの整理には次の文を使います。

FLUSH QUERY CACHE;   -- 断片化を解消する(保存済みの結果は消さない)
RESET QUERY CACHE;   -- 保存済みの結果をすべて消す

無効に戻すときは、設定ファイルの query_cache_type = 0 と query_cache_size = 0 にして再起動します。

WordPressで代わりに使うキャッシュ

MySQL 8.0 以降を使っている場合や、クエリキャッシュの効果が出ない場合は、アプリケーション側でキャッシュします。

  • 永続オブジェクトキャッシュ: WordPress はオブジェクトキャッシュ(wp_cache_get() / wp_cache_set())を持っていますが、標準では1リクエストの間しか保持しません。Redis や Memcached をバックエンドにするドロップイン(wp-content/object-cache.php)を入れると、オプションや投稿のデータをリクエストをまたいで再利用でき、データベースへの問い合わせが減ります。WordPress 6.1 以降は「サイトヘルス」で、条件に応じて永続オブジェクトキャッシュの利用を勧める項目が表示されます。
  • ページキャッシュ: ログインしていない訪問者向けに、生成済みの HTML を保存して返します。PHP とデータベースの処理自体を省けるため、効果は大きくなりやすい方法です。
  • 遅いクエリそのものの改善: どのクエリが遅いかは Query Monitor プラグインで確認できます。インデックスの追加や不要なプラグインの見直しの方が、キャッシュより根本的な対策になります。

設定手順は次の記事を参照してください。

注意点

  • クエリキャッシュに割り当てたメモリは InnoDB バッファプールなどと同じサーバーのメモリから取られます。メモリの少ない VPS では、バッファプールを削ってまで大きくしないでください。
  • 共用サーバーやマネージドデータベースでは、SET GLOBAL の権限がなく、設定を変えられないことがあります。
  • MariaDB から MySQL 8.0 以降へ移行する予定がある場合、クエリキャッシュの設定は移行先で使えません。設定ファイルに残すと MySQL が起動しなくなるため、移行時に削除してください。

まとめ

  • クエリキャッシュは MySQL 8.0 で削除済みで、MariaDB では既定で無効、公式にも有効化は勧められていません。
  • MariaDB で試すなら query_cache_type と query_cache_size を設定し、Qcache_hits と Qcache_lowmem_prunes を見て残すか判断します。
  • WordPress の高速化では、永続オブジェクトキャッシュ・ページキャッシュ・遅いクエリの改善を優先してください。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲