クエリキャッシュとは何ですか?
MySQL クエリ キャッシュは、MySQL 5.7 で非推奨になりました (8.0 では削除されました) が、以前に実行されたステートメントをメモリに保存します。つまり、クエリ キャッシュは通常、データベースのメモリ中央に SELECT ステートメントを保存します。したがって、クエリを実行し、しばらくしてからまったく同じクエリを再度実行すると、結果はディスクからではなくメモリから取得されるため、より速く返されます。
クエリ キャッシュはクエリと結果セットをキャッシュします。したがって、同じクエリを実行すると、クエリのキャッシュされた結果がすぐに返されます。クエリ キャッシュ サイズは、query_cache_size システム変数を設定することで制御できますが、次の点に注意してください。クエリでクエリ キャッシュを使用する場合、クエリはバイトごとに同一である必要があります。これは、これら 2 つのクエリをまったく同じ方法でキャッシュする必要があると考えている場合でも、次のことを意味します。 demo_table where column = 'Demo';
実際には、そうではありません。 MySQL クエリ キャッシュですべてのクエリが同一であることが必要な場合、たとえ 1 バイトだけ異なっていても結果は返されません。
つまり、要約すると、MySQL がステートメントを実行するときに最初に行うことは、クエリ キャッシュが有効になっているかどうかを確認することです (復習が必要な場合は、遅い MySQL クエリに関する以前のブログの記事に戻ってください。) ) クエリ キャッシュが有効な場合、MySQL はまずクエリに関連する一致があるかどうかを確認し、一致しない場合は次のステップに進みます。重複した一致がある場合、MySQL はクエリ キャッシュから結果を返します。
MySQL 内部クエリ キャッシュ
マッチに戻る前に、MySQL のクエリ キャッシュは MySQL の確認を必要とします。 d OES このユーザーはそのようなアクションを完了するために必要な権限を持っていますか?クエリの実行を拒否する必要がありますか?
MySQL がチェックする権限のリストは次のとおりです:
権限
簡単な説明
|
| ALL
すべての権限を特定の MySQL ユーザーに付与します。
| SELECT |
特定の MySQL ユーザーに、指定されたデータベースから行を選択する権限を付与します。
| UPDATE |
特定の MySQL ユーザーに、指定されたテーブル内の既存の行を更新する権限を付与します。
| SHOW DATABASES |
特定の MySQL ユーザーが、特定の MySQL インスタンスに存在するすべての MySQL データベースのリストを取得できるようにします。
| USAGE |
ユーザーに MySQL のみを使用する権限を与えます。つまり、ユーザーは MySQL 内でクエリを実行できません。本質的には「特権のない者」と同義。
|
にはさらに多くの権限がありますが、ご理解いただけたでしょうか。 MySQL はテーブル関連の情報をキャッシュされたクエリとともに保存するため、クエリのキャッシュには権限が重要です。権限は、MySQL の結果チェック プロセスの最初の段階の 1 つであるため、同様に重要です。すべての仕組みは次のとおりです。 |
優先度の識別
MYSQL STATUS
|
| #1 | MySQL はクエリ キャッシュ内の権限をチェックしています。
まず、MySQL は、特定のユーザーが特定の結果にアクセスする権限を持っているかどうかを確認します。
#2 |
MySQL はクエリ自体のクエリ キャッシュをチェックしています。 |
次に、MySQL はクエリ キャッシュに同じクエリが存在するかどうかのチェックを開始します。一致するものがあれば、MySQL は戻りますが、一致しない場合は、MySQL は次のステップに進みます。 |
3 |
MySQL はクエリ キャッシュ内のエントリを無効としてマークしました。 |
テーブルが変更されると、クエリ キャッシュを更新する必要があります。したがって、このステップでは、MySQL はクエリ キャッシュ内のエントリを無効としてマークすることを決定します。 |
4 |
結果を送信します。 |
MySQL はキャッシュされた結果を送信し、表示します。 |
#5 | 結果をキャッシュに保存します。 | MySQL はクエリ結果をクエリ キャッシュに保存します。 |
#6
クエリ キャッシュはロックされています。 |
これでキャッシュ プロセスが完了しました。MySQL はクエリ キャッシュをロックしました。 |
|
「MySql にはキャッシュがありません!」: クエリ キャッシュが破損しているかどうかによって異なりますか?
クエリで変数を使用すると、関数状態であってもパーティション状態であっても、クエリ キャッシュは無効になります。たとえば、ビッグ データを扱っており、SELECT ... INTO OUTFILE を使用して大規模なデータ セットを MySQL にロードする場合、結果もキャッシュされません。通常、SELECT ... [LOCK | FOR | INTO] のようなクエリを使用する場合、クエリ キャッシュは機能しません。また、NULL 値を持つ列の AUTO_INCREMENT 値をチェックしている場合にもクエリ キャッシュは機能しません。列 AUTO_INCREMENT には増分があり、次のようなクエリを実行します。
SELECT * FROM demo_table WHERE increment IS NULL;
ログイン後にコピー
クエリ キャッシュは有効になりません。
おっしゃるとおり、これらの機能はすべて役に立たないと感じる人もいるかもしれません。 MySQL の他の機能と同様、クエリ キャッシュには独自の制限があるため、常に機能するとは限りません。上記に加えて、ステートメントが警告を生成した場合、ステートメントが TEMPORARY ストレージ エンジンを備えたテーブルで実行された場合、およびその他の特殊なケースでは、動作が拒否されます。誰かがテーブルに何かを書き込むたびに、クエリ キャッシュもクリアされます。
クエリ キャッシュの機能は、query_cache_size パラメーターにも依存します。このパラメータは大きいほど良いですが、このパラメータはメモリに大きく依存することに注意してください。クエリ キャッシュの基本構造にはデフォルトで少なくとも 40kB のストレージが必要であり、そのデフォルト値は 1MB ~ 16MB であることに注意してください。データベースがデータを頻繁に読み取る場合は、パラメーター値を増やすと最適な解決策が見つかる可能性がありますが、もう一度実験してください。
「RESET QUERY CACHE」ステートメントを使用すると、クエリ キャッシュ内のすべての内容をクリアできます。 FLUSH TABLES のようなステートメントを使用すると、すべてのクエリ キャッシュ値も削除されます。
MySQL では、クエリを実行することでクエリ キャッシュに保存されているクエリの数を確認することもできます:
SHOW STATUS LIKE 'Qcache_queries_in_cache%';
ログイン後にコピー
次のような結果が得られます:
MySQL:
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| Qcache_queries_in_cache | 1 |
+-------------------------+--------+
ログイン後にコピー
この場合、クエリ キャッシュが現在結果をキャッシュしていることがわかります。 FLUSH TABLES のようなステートメントを実行すると、すべての値が消えます。
以上がMySQL のクエリ キャッシュに関する基本的な知識は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。