クエリキャッシュは、SELECT ステートメントの結果セットをメモリに格納します。これにより、同一のクエリでは解析と実行が完全にバイパスされ、結果がキャッシュから直接返されます。このため、データが安定しており、読み取り負荷が高く書き込みが少ないワークロードでは、CPU 使用率が削減され、IOPS が低下し、クエリの応答時間が短縮されます。書き込み負荷が高いワークロードや多様なクエリパターンの場合、キャッシュの無効化によるオーバーヘッドが全体のスループットを低下させる可能性があるため、本番環境で有効にする前に、実際のワークロードでテストしてください。
クエリキャッシュの利用シーン
クエリキャッシュは、次のすべての条件を満たす場合に最も効果的です。
-
テーブルデータの変更がまれであるか、静的である。
-
同じ SELECT ステートメントが繰り返し実行される。
-
クエリの結果セットが 1 MB 未満である。
クエリキャッシュは必ずしも有益とは限りません。テーブルへの書き込みが頻繁なワークロードや、クエリパターンが多様なワークロードでは、キャッシュの無効化と再作成のオーバーヘッドによって、全体のスループットが低下する可能性があります。本番環境で有効にする前に、実際のワークロードでテストしてください。
仕組み
-
ApsaraDB RDS for MySQL は、クライアントから受信した各 SELECT ステートメントのハッシュ値を計算します。
-
ハッシュがキャッシュされたエントリと一致する場合、結果はすぐに返されます。クエリが解析または実行されることはありません。
-
一致するものがない場合、クエリは通常どおり実行され、ハッシュと結果がキャッシュに保存されます。
-
いずれかのテーブルが変更されると、そのテーブルを参照するキャッシュ内のすべてのクエリは、直ちに無効化されて削除されます。
制限事項
次のクエリはキャッシュされません。
-
大文字と小文字、空白、データベースコンテキスト、プロトコルバージョン、または文字セットのみが異なるクエリは、別個のクエリとして扱われ、個別にキャッシュされます。
-
サブクエリの結果セット。外部クエリの最終的な結果セットのみがキャッシュされます。
-
ストアドファンクション、ストアドプロシージャ、トリガー、またはイベント内で実行されるクエリ。
-
now()、curdate()、last_insert_id()、rand()などの非決定的関数を呼び出すクエリ。 -
mysql、information_schema、またはperformance_schemaデータベース内のテーブルを参照するクエリ。 -
一時テーブルを参照するクエリ。
-
警告を生成するクエリ。
-
SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE、またはSELECT * FROM … WHERE AUTOINCREMENT_COL IS NULLを含むクエリ。 -
ユーザー定義変数を参照するクエリ。
-
SQL_NO_CACHEヒントを使用するクエリ。
クエリキャッシュの設定
ApsaraDB RDS コンソールで、次の 3 つのパラメーターを設定します。
| パラメーター | デフォルト | 説明 |
|---|---|---|
query_cache_type |
— | キャッシュがアクティブかどうかを制御します。0 = オフ、1 = オン (SELECT SQL_NO_CACHE を使用するクエリは除外)、 2 = オンデマンドのみ (SELECT SQL_CACHE クエリのみがキャッシュされる)。 |
query_cache_size |
3 MB | キャッシュに割り当てられる合計メモリ (バイト単位)。1024 の倍数である必要があります。 |
query_cache_limit |
1 MB | キャッシュされる単一クエリの最大結果セットサイズ (バイト単位)。この値より大きい結果はキャッシュされません。 |
左側メニューで、 [パラメーター] をクリックします。パラメーターリストで query_cache_type を見つけ、その値を目的の値に変更します。この変更は、インスタンスの再起動後にのみ有効になります。必要に応じて、query_cache_limit (有効な値:1~1048576) や query_cache_size (有効な値:0~104857600) などの関連パラメーターも変更できます。パラメーターの横にある情報アイコンをクリックすると、その説明が表示されます。
query_cache_type を変更すると、RDS インスタンスが自動的に再起動されます。query_cache_size を 1024 の倍数ではない値に設定すると、コンソールから The specified parameter is invalid というエラーが返され、エラーコードは InvalidParameters.Malformed になります。
キャッシュの有効化と無効化
キャッシュは、query_cache_size > 0 かつ query_cache_type が 1 または 2 の場合に 有効 になります。
キャッシュは、query_cache_size = 0 または query_cache_type = 0 の場合に 無効 になります。
推奨事項
-
query_cache_sizeを大きすぎる値に設定しないでください。キャッシュが大きすぎると、インスタンスの他のメモリ構造を圧迫するだけでなく、キャッシュルックアップのオーバーヘッドも増加します。インスタンスタイプに基づき、10 MB~100 MB の範囲の値から始め、実際の使用状況に基づいて調整してください。 -
クエリキャッシュを有効化または無効化するには、
query_cache_sizeの値を調整します。query_cache_typeではなく、query_cache_typeの変更はインスタンスの再起動後にのみ有効になるためです。 -
クエリキャッシュは特定のワークロードにのみメリットがあります。パフォーマンスの低下やその他の問題を回避するために、有効にする前に実際のワークロードで十分にテストしてください。
キャッシュパフォーマンスの監視と検証
キャッシュ統計の確認
次のステートメントを実行して、キャッシュの使用状況を確認します。
SHOW GLOBAL STATUS LIKE 'Qcache%';
出力には、以下のステータス変数が含まれます。
| 変数 | 説明 |
|---|---|
Qcache_hits |
キャッシュから返されたクエリの数 |
Qcache_inserts |
キャッシュに追加されたクエリの数 |
Qcache_not_cached |
キャッシュできなかったクエリの数 |
Qcache_queries_in_cache |
現在キャッシュされているクエリの数 |
出力例:
mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| Qcache_free_blocks | 2763 |
| Qcache_free_memory | 10115160 |
| Qcache_hits | 365589713 |
| Qcache_inserts | 612280336 |
| Qcache_lowmem_prunes | 1257159 |
| Qcache_not_cached | 1805250864 |
| Qcache_queries_in_cache | 9318 |
| Qcache_total_blocks | 22409 |
+-------------------------+------------+
ApsaraDB RDS コンソールを使用した検証
左側メニューで、 [自律サービス (旧 CloudDBA)] > [パフォーマンス傾向] を選択します。 [MySQL CPU/メモリ使用率] チャートを表示し、CPU 使用率とメモリ使用率の両方が正常範囲内にあることを確認します。