1. 原則の概要クエリ キャッシュは、「クエリによって返された結果」をキャッシュします。ただし、「クエリによって返された結果」を単にキャッシュするだけでは正確ではありません。クエリ キャッシュはクエリ ステートメントもキャッシュし、「クエリ ステートメント」と「クエリによって返された結果」をメモリにマッピングします。 クエリ キャッシュの動作原理は、クエリを実行する最も速い方法は、クエリを実行しないことです。クエリ キャッシュのコンポーネント図とフロー チャートは次のとおりです。 クエリキャッシュシステム変数クエリ キャッシュの主な構成可能なシステム変数は次のとおりです。 1. クエリキャッシュを持つmysqld がクエリ キャッシュをサポートしているかどうかを示します。 2. クエリキャッシュ制限クエリ キャッシュによってキャッシュできる単一のクエリの最大結果セット サイズを示します。デフォルト値は 1 MB です。クエリの結果セットのサイズがこのシステム変数の値を超える場合、クエリ キャッシュはこのクエリの結果セットをキャッシュしません。 3. クエリキャッシュ最小解像度単位MySQL が毎回クエリ キャッシュに割り当てるメモリの最小サイズ、つまりクエリ結果をキャッシュするために使用されるメモリ領域の最小サイズを示します。デフォルト値は 4KB です。 4. クエリキャッシュサイズクエリ キャッシュで使用できる最大メモリ サイズを示します。デフォルト値は 1MB です。値は 1024 の整数倍である必要があります。整数倍でない場合、MySQL は自動的に 1024 の倍数の最大値に調整します。 5. クエリキャッシュタイプクエリ キャッシュの動作モードを示し、クエリ キャッシュ機能のオン/オフを切り替えます。0 (オフ)、1 (オン)、2 (要求) に設定できます。
6. クエリキャッシュwlock_invalidateテーブルに書き込みロックが追加されたときに、テーブルに関連付けられたクエリ キャッシュを最初に無効にするかどうかを制御します。 1 (オン) と 0 (オフ) の 2 つの値があります。
頻繁に調整する必要がある環境変数は、query_cache_limit と query_cache_min_res_unit です。どちらも、実際のビジネス ニーズに基づいて適宜調整する必要があります。たとえば、キャッシュされたクエリ結果セットのほとんどが 4 KB 未満の場合、メモリの浪費を避けるために query_cache_min_res_unit の値を適切に調整できます。クエリ結果セットのサイズが 1 MB を超える場合は、サイズが制限を超えているために結果セットがキャッシュされないように、query_cache_limit の値を調整する必要があります。 クエリキャッシュステータス変数MySQL は、クエリ キャッシュの現在のステータスを記録するための一連のステータス変数を提供しており、クエリ キャッシュが正常に実行されているかどうか、ヒット率はどれくらいか、メモリ領域は十分かどうかなどを確認できます。クエリ キャッシュのステータス変数は次のとおりです。 1. Qcache_free_blocksクエリ キャッシュ内に現在いくつの空きメモリ ブロックがあるかを示します。この値が大きい場合、クエリ キャッシュにメモリの断片化が大量にある可能性があります。 FLUSH QUERY CACHE はキャッシュをデフラグして、より大きな空きメモリ ブロックを作成します。 2. Qキャッシュ空きメモリクエリ キャッシュの現在の空きメモリ サイズを示します。 3. Qcache_hitsクエリ キャッシュにヒットしたクエリの数を示します。 4. Qcache_挿入クエリ キャッシュに新しいレコードが挿入された回数、つまりクエリがヒットしなかった回数。 5. Qcache_lowmem_prunesクエリ キャッシュのメモリ不足によりキャッシュから削除されたクエリ結果の数を示します。この値が継続的に増加している場合は、通常、クエリ キャッシュの空きメモリが不足している (Qcache_free_memory で判断) か、メモリが著しく断片化されている (Qcache_free_blocks で判断) ことを意味します。 6. Qcache_not_cachedキャッシュされていないクエリの数を示します。クエリ結果がキャッシュされない状況は 3 つあります。1 つ目は query_cache_type の設定によるもの、2 つ目はクエリが SELECT ステートメントではないもの、3 つ目は now() などの関数が使用され、クエリ ステートメントが変更され続けるもの。 7. Qcache_queries_in_cacheクエリ キャッシュに現在含まれているクエリ結果の数を示します。 8. Qcache_total_blocksクエリ キャッシュ内のメモリ ブロックの合計数を示します。 4. 利点と欠点1. 利点クエリ キャッシュ クエリは、MySQL がクライアントのクエリ要求を受信し、クエリ権限を検証した後、クエリ SQL を解析する前に実行されます。つまり、MySQL はクライアントからクエリ SQL を受信すると、対応する権限を確認し、クエリ キャッシュを通じて結果を検索するだけで済みます。オプティマイザ モジュールを通じて実行プランを分析して最適化する必要はなく、ストレージ エンジンとのやり取りも必要ありません。クエリ キャッシュはメモリベースであり、対応するクエリ結果をメモリから直接返すため、ディスク I/O と CPU 計算が大幅に削減され、非常に高い効率が実現します。 2. デメリットクエリ キャッシュの利点は明らかですが、いくつかの欠点も無視できません。
5. よくある質問1. クエリ キャッシュはどのような状況で使用すればよいですか?実際、すべてのテーブルがクエリ キャッシュの使用に適しているわけではありません。クエリ キャッシュが失敗する主な理由は、対応するテーブルが変更されたことです。したがって、頻繁に変更されるテーブルではクエリ キャッシュを使用しないようにする必要があります。 MySQL には、クエリ キャッシュ専用の SQL オプションとして、SQL_NO_CACHE と SQL_CACHE の 2 つがあります。 query_cache_type が 1 (ON) に設定されている場合、SQL_NO_CACHE オプションを使用してクエリ キャッシュを強制的に使用しないようにすることができます。また、query_cache_type が 2 (DEMAND) に設定されている場合、SQL_CACHE オプションを使用してクエリ キャッシュを強制的に使用することができます。クエリ キャッシュを強制的に使用しないようにすることで、MySQL は頻繁に変更されるテーブルでクエリ キャッシュが使用されるのを防ぐことができ、メモリのオーバーヘッドだけでなく、ハッシュ計算と検索のオーバーヘッドも削減されます。 2. クエリ キャッシュとクエリ ステートメントの関係は何ですか?MySQL が受信したクエリ ステートメントが単一テーブル SQL か複数テーブル SQL か、またはサブクエリが含まれているかどうかに関係なく、クエリとして扱われ、Union ステートメントを含め、キャッシュのために複数のクエリに分割されることはありません。 3. クライアントによって送信されたクエリ ステートメントの大文字と小文字は、クエリ キャッシュに影響しますか?影響力がある。クエリ キャッシュはハッシュ構造を使用してメモリにマップされるため、ハッシュ アルゴリズムの基礎はクエリ ステートメントを構成する文字です。したがって、クエリ キャッシュにヒットするには、クエリ ステートメント全体が文字レベルで完全に一貫している必要があります。 4. どのような状況で、クエリ ステートメントのクエリ キャッシュにキャッシュされたクエリ結果が無効になりますか?クエリ キャッシュの内容が実際のデータと完全に一致するように、テーブル内のデータに追加、変更、削除などの変更があった場合、テーブルを参照するすべてのクエリ キャッシュ キャッシュ データが無効になります。 5. クエリ キャッシュの断片化率はどれくらいですか?何の役に立つの?クエリキャッシュの断片化率 = Qcache_free_blocks / Qcache_total_blocks * 100% 6. クエリ キャッシュの使用率はどのくらいですか?何の役に立つの?クエリキャッシュ使用率 = (query_cache_size - Qcache_free_memory) / query_cache_size * 100% クエリ キャッシュの使用率が 25% 未満の場合、query_cache_size の設定が大きすぎるため、適切に削減できることを意味します。クエリ キャッシュの使用率が 80% を超え、Qcache_lowmem_prunes > 50 の場合、query_cache_size が少し小さいか、メモリの断片化が多すぎることを意味します。 7. クエリ キャッシュのヒット率はどれくらいですか?何の役に立つの? ① キャッシュ可能なクエリのクエリキャッシュヒット率 = Qcache_hits / (Qcache_hits + Qcache_inserts) * 100% ヒット率が 50 ~ 70% の範囲内であれば、クエリ キャッシュのキャッシュ効率が高いことを示します。ヒット率が 50% を大幅に下回る場合は、クエリ キャッシュを無効にする (query_cache_type を 0 (OFF) に設定する) か、オンデマンドで使用する (query_cache_type を 2 (DEMAND) に設定する) ことをお勧めします。節約したメモリは InnoDB のバッファ プールとして使用できます。 8. クエリ キャッシュの空きメモリが不足しているか、メモリの断片化が多すぎるかどうかをどのように判断しますか?Qcache_lowmem_prunes の値が大きい場合は、クエリ キャッシュのメモリ サイズが小さすぎるため、増やす必要があることを意味します。 Qcache_free_blocks 値が比較的大きい場合は、メモリの断片化が大量にあることを意味し、FLUSH QUERY CACHE ステートメントを使用してメモリの断片化をクリーンアップする必要があります。 9. query_cache_min_res_unit システム変数はどのくらいの大きさに設定すればよいですか?query_cache_min_res_unit の計算式は次のとおりです。 query_cache_min_res_unit = (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache 通常、クエリ キャッシュ サイズ (query_cache_size システム変数) を 256 MB より大きく設定することは推奨されません。 MySQLクエリキャッシュQuery_cacheの機能MySQL のクエリ キャッシュは実行プランをキャッシュするのではなく、クエリとその結果セットをキャッシュします。つまり、同一のクエリ操作のみがキャッシュにヒットするため、MySQL のクエリ キャッシュ ヒット率は非常に低くなります。一方、結果セットが大きいクエリの場合、クエリ結果をキャッシュから直接読み取ることができるため、クエリの効率が効果的に向上します。 では、キャッシュ サイズはどのように設定するのでしょうか?見てみましょう: 1. MySQL クライアントのコマンドラインで、キャッシュが有効になっているかどうか、およびキャッシュ設定のサイズを確認できます。 mysql> '%query_cache%' のような変数を表示します。 +------------------------------+-------------+ | 変数名 | 値 | +------------------------------+-------------+ | クエリキャッシュがある | はい | | クエリキャッシュ制限 | 1048576 | | クエリ キャッシュの最小解像度単位 | 4096 | | クエリキャッシュサイズ | 16106127360 | | クエリキャッシュタイプ | オン | | query_cache_wlock_invalidate | オフ | +------------------------------+-------------+ セット内の6行(0.01秒) で: query_cache_type: キャッシュ機能を有効にするかどうか。値はON、OFF、DEMANDで、デフォルト値はONです。 query_cache_wlock_invalidate: 他のクライアントが MyISAM テーブルに書き込んでいるときにクエリがクエリ キャッシュ内にある場合、キャッシュされた結果を返すか、書き込み操作が完了するまで待ってからテーブルを読み取って結果を取得するかを示します。 query_cache_limit は、単一のクエリで使用できるバッファ サイズを指定します。デフォルトは 1M です。 query_cache_min_res_unit は、システムによって割り当てられる最小のキャッシュ ブロック サイズです。デフォルト値は 4KB です。大きな値を設定すると、大規模なデータ クエリに適していますが、クエリがすべて小規模なデータ クエリである場合は、メモリの断片化と無駄が発生しやすくなります。query_cache_size: は、キャッシュのサイズを示します。 上記の指標を理解した後、それらを MySQL 構成ファイル my.cnf で設定できます。次に、mysl サーバーを再起動します。 [mysqld]の下にパラメータを追加します。通常は、query_cache_size と query_cache_type が設定されます。 2. 上記のビューはキャッシュ構成です。通常は構成ファイルから値を読み取りますが、MySQL の現在のデータ キャッシュ サイズをリアルタイムで表示する必要がある場合もあります。 mysql> '%qcache%' のようなステータスを表示します。 +-------------------------+-----------+ | 変数名 | 値 | +-------------------------+-----------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 1031832 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 16489053 | | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+-----------+ セット内の行数は 8 です (0.00 秒) 説明する: Qcache_free_memory: キャッシュ内のメモリを解放します。 Qcache_total_blocks: キャッシュ内のブロック数。 Qcache_lowmem_prunes: キャッシュのメモリが不足し、クエリをさらに実行できるようにスペースを確保するためにキャッシュを削除する必要があった回数。この数値は、時間の経過とともに確認するのが最適です。数値が増加している場合は、非常に深刻な断片化またはメモリ不足を示している可能性があります。これを判断するには、Qcache_free_blocks と Qcache_free_memory という 2 つのインジケーターを確認する必要があります。 3. キャッシュをクリアします。 クエリキャッシュのフラッシュコマンド キャッシュを増やすと、クエリの効率が向上します。 次に例を示します。 mysql> mob_adnを使用する データベースが変更されました mysql> creative_output から count(*) を選択します。 +----------+ | カウント(*) | +----------+ |87151154| +----------+ セット1列目(3分18.29秒) mysql> creative_output から count(*) を選択します。 +----------+ | カウント(*) | +----------+ |87151154| +----------+ セット内の 1 行 (0.00 秒) mysql> creative_output から count(*) を選択します。 +----------+ | カウント(*) | +----------+ |87151154| +----------+ セット内の 1 行 (0.00 秒) キャッシュが非常に強力であることがわかります。 受講者の中には、innodb_buffer_pool というパラメータを思い浮かべる方もいるかもしれません。引き続き、この 2 つの機能と違いについてお話しします。 ちなみに、ここにいくつかの SQL 最適化を示します (非常に優れています)。 https://www.cnblogs.com/L-dongf/p/9163848.html これで、画像とテキストによる MySQL Query Cache に関するこの記事は終了です。MySQL Query Cache に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: vue プロジェクトのデプロイと Nginx でのプロキシ設定の問題の分析
>>: キャンバスでPS消しゴムスクラッチカードの効果を実現するためのJSの使用方法の詳細な説明
例えば:コードをコピーコードは次のとおりです。 <html> <ヘッド> &...
環境要件: IPホスト名192.168.1.1ノード1プロジェクト計画:コンテナネットワークセグメン...
目次MySQL マスター スレーブ レプリケーション環境を設定する場合、マスター データベースとスレ...
この記事では、画像の切り取りとアップロードを実装するためのvue-cropperコンポーネントの具体...
VirtualBoxのインストールディレクトリを見つけます。ディレクトリ内には容量を拡張するために...
Docker と Docker Machine の違いDocker はクライアント サーバー アーキ...
まず、Vue-cli をインストールする必要があります。 npm インストール -g vue-cli...
1. 効果を達成する 2 知識ポイント2.1 <label> タグHTML では、<...
この記事では、テーブルの作成、フィールドの追加、フィールドの変更、インデックスの追加を行う一般的な ...
導入クロージャは JavaScript の非常に強力な機能です。いわゆるクロージャは関数内の関数です...
最近、外国人が CSS3 を使用してアコーディオン効果を実現しているビデオを見たので、自分で学習した...
序文部門テーブルなどのデータベース内のツリー構造データの場合、部門のすべての従属部門または部門のすべ...
実際のプロジェクトでは、緊急事態を防ぐためにデータベースを頻繁にバックアップする必要があります。しば...
最近のビジネスでは、オンライン トレーニング システムが特定のオンライン プレビュー ページに対する...
はじめに: 時間ポイントによる MySQL データベースの復旧どの企業にとっても、データは最も価値の...