高速クエリキャッシュは、PolarDB ネイティブのキャッシュエンジンであり、読み取り負荷の高いワークロードの秒間クエリ数 (QPS) を向上させます。結果セットをキャッシュし、SQL の再解析、再最適化、再実行を行うことなく、メモリから直接繰り返しクエリを処理します。
仕組み
クエリが実行されると、高速クエリキャッシュはその結果セットを保存します。基になるデータが変更される前に同じクエリが再度実行された場合、キャッシュされた結果がすぐに返されます。データが変更されると、キャッシュは自動的に無効になります。
高速クエリキャッシュは、MySQL ネイティブクエリキャッシュの 3 つの主要な制限を解決します:
| 制限 | 高速クエリキャッシュによる対処法 |
|---|---|
| 同時実行性のボトルネック:MySQL ネイティブクエリキャッシュはグローバルロックを使用しており、高い同時実行性のもとでアクセスをシリアル化するため、CPU コア数が増えるにつれてパフォーマンスがさらに低下します。 | 高速クエリキャッシュは、グローバルロックをロックフリー同期メカニズムに置き換えることで、複数の CPU コアが競合することなくクエリを並列処理できるようにします。 |
| 不十分なメモリ再利用:MySQL ネイティブクエリキャッシュは、固定のメモリブロックを事前に割り当て、効率的に再利用できないため、メモリが十分に活用されません。 | 高速クエリキャッシュは、動的メモリ割り当てを使用して無効なキャッシュエントリを即座に再利用し、メモリ使用量をスリムかつ柔軟に保ちます。 |
| 低いキャッシュヒット率でのパフォーマンス低下:MySQL ネイティブクエリキャッシュは、キャッシュヒット率が低い場合にクエリを遅くする可能性のあるオーバーヘッドを追加します。 | 高速クエリキャッシュは、キャッシュヒット率をリアルタイムで監視し、キャッシュポリシーを動的に調整して、ヒット率が低下したり、ワークロードに読み取りと書き込みが混在したりする場合でも、安定したパフォーマンスを維持します。 |
MySQL ネイティブクエリキャッシュは MySQL 8.0 で削除されました。高速クエリキャッシュは、PolarDB 専用に構築された代替機能です。
サポート対象バージョン
高速クエリキャッシュは、以下の PolarDB for MySQL のリビジョンバージョンで利用できます:
| PolarDB バージョン | 最小リビジョンバージョン |
|---|---|
| PolarDB for MySQL 8.0 | 8.0.1.1.5 |
| PolarDB for MySQL 5.7 | 5.7.1.0.15 |
| PolarDB for MySQL 5.6 | 5.6.1.0.29 |
ご利用のクラスターのリビジョンバージョンを確認するには、「エンジンバージョンのクエリ」をご参照ください。
高速クエリキャッシュの利用シーン
高速クエリキャッシュは、次のような場合に最も効果を発揮します:
ワークロードが読み取り負荷が高い場合 (書き込みよりも読み取りが大幅に多い)。
クエリが頻繁に繰り返され、キャッシュヒット率が高い (約 60% 以上) 状態を維持できる場合。
多数の同時読み取りリクエストがインメモリでの処理から恩恵を受ける場合。
次のような場合は、高速クエリキャッシュを有効にしないか、DEMAND モードに設定してください:
書き込みスループットが高い、またはデータが頻繁に変更される場合。このシナリオでキャッシュを有効にすると、QPS が約 2% 低下する可能性があります。
繰り返されるクエリがほとんどなく、キャッシュヒット率が低いままである場合。
高速クエリキャッシュの有効化
各 PolarDB クラスター仕様には、高速クエリキャッシュ用に事前に割り当てられたメモリ容量が含まれています。この機能を有効にするには、ご利用のクラスターまたはノードの設定で適切なパラメーターを設定します。手順については、「クラスターとノードのパラメーターの指定」をご参照ください。
| PolarDB バージョン | パラメーター | 設定する値 |
|---|---|---|
| PolarDB for MySQL 8.0 | loose_query_cache_type | ON |
| PolarDB for MySQL 5.6 または 5.7 | query_cache_type | 1 |
高速クエリキャッシュの管理
loose_query_cache_type を使用したキャッシュ動作の制御
loose_query_cache_type を使用して、高速クエリキャッシュを常にアクティブにするか、オプションにするか、無効にするかを制御します。このパラメーターはクラスターレベルで設定するか、特定のワークロードに対してセッションレベルでオーバーライドできます。
| 値 | 動作 |
|---|---|
OFF (デフォルト) | 高速クエリキャッシュは無効になります。 |
ON | 高速クエリキャッシュはすべてのクエリに対してアクティブになります。クエリをキャッシュから除外するには、クエリに SQL_NO_CACHE を追加します。 |
DEMAND | 高速クエリキャッシュはデフォルトで非アクティブです。クエリをキャッシュするには、クエリに SQL_CACHE を追加します。 |
ワークロードに合ったモードを選択してください:
書き込みスループットが高い、またはデータ更新が頻繁な場合 — キャッシュのオーバーヘッドを避けるために
OFFを使用します。繰り返される低速クエリが多い、またはキャッシュヒット率が高い場合 —
ONを使用して QPS の向上を最大化します。一部のクエリのみが恩恵を受ける混合ワークロードの場合 —
DEMANDを使用し、頻繁に繰り返されるクエリにSQL_CACHEを追加します:
SELECT SQL_CACHE id, name FROM customer;「query_cache_lease_time」を使用したキャッシュエントリの有効期間の制御
高速クエリキャッシュは動的にメモリを再利用します。キャッシュされた結果セットが query_cache_lease_time (秒単位) で指定された期間参照されない場合、キャッシュエントリは解放され、そのメモリは再利用されます。
デフォルト値は 3600 秒 (1 時間) です。
パフォーマンスベンチマーク
以下のベンチマークは、高速クエリキャッシュを有効にした場合 (PolarDB-QC) と無効にした場合 (QC-OFF) の QPS への影響を示しています。
テスト環境:
| パラメーター | 値 |
|---|---|
| クラスター | PolarDB for MySQL 8.0 Cluster Edition、8 コア、64 GB メモリ |
| キャッシュメモリ | 4 GB |
| テストツール | Sysbench |
| テストデータ | 25 表 × 40,000 行、25 表 × 400,000 行 |
| テストケース | oltp_read_only、oltp_point_select、oltp_read_write(rand-type = special または uniform |
すべての結果はプライマリノードのみに基づいています。
結果の概要:
| シナリオ | キャッシュヒット率 | QPS の変化 |
|---|---|---|
| 高いヒット率 (ケース 1、3、4、5、7) | 63%–99% | +53% から +106% |
| 低いヒット率 (ケース 2、6) | 低い | -3% 以下 |
| 読み取り/書き込み混合トラフィック | — | -2% 以下 |
ケース 7 (special oltp_point_select、400,000 行) は 99% のキャッシュヒット率に達し、最大の QPS 向上を示しています。
テストケースとチャート:
ケース 1:25 テーブル × 40,000 行、rand-type = special、oltp_read_only

ケース 2:25 テーブル × 40,000 行、rand-type = uniform、oltp_read_only

ケース 3:25 テーブル × 40,000 行、rand-type = special、oltp_point_select

ケース 4:25 テーブル × 40,000 行、rand-type = uniform、oltp_point_select

ケース 5:25 テーブル × 400,000 行、rand-type = special、oltp_read_only

ケース 6:25 テーブル × 400,000 行、rand-type = uniform、oltp_read_only

ケース 7:25 テーブル × 400,000 行、rand-type = special、oltp_point_select

ケース 8:25 テーブル × 400,000 行、rand-type = uniform、oltp_point_select

ケース 9:25 テーブル × 400,000 行、rand-type = special、oltp_read_write

互換性
高速クエリキャッシュは、グローバル整合性 (高性能モード) 機能と互換性があります。ただし、高速クエリキャッシュとグローバル整合性 (高性能モード) の両方が同時にアクティブで、かつグローバル整合性 (高性能モード) の MTT 最適化も有効になっている場合、MTT 最適化は非アクティブになります。
グローバル整合性 (高性能モード) の詳細については、「概要」をご参照ください。