MySQLがクエリキャッシュをキャンセルした理由

MySQLがクエリキャッシュをキャンセルした理由

MySQL には以前、クエリ キャッシュ (Query Cache) がありました。8.0 以降では、このクエリ キャッシュは使用されなくなりました。では、これを廃止する理由は何でしょうか?この記事ではそれについて紹介します。

MySQL クエリ キャッシュは、クエリ結果のキャッシュです。 SEL で始まるクエリをハッシュ テーブルと比較し、一致する場合は前のクエリの結果を返します。一致させる場合、クエリはバイトごとに一致させる必要があります。たとえば、SELECT * FROM t1; は select * from t1; と同じではありません。また、不確実なクエリ結果の一部はキャッシュできず、テーブルを変更すると、これらのテーブルのすべてのキャッシュが無効になります。したがって、クエリ キャッシュの最適なシナリオは読み取り専用であり、特に数百万行を調べて数行のみを返す必要がある複雑なクエリではこれが当てはまります。クエリがこのような特性を満たしている場合、クエリ キャッシュを有効にするとクエリのパフォーマンスが向上します。

テクノロジーが進歩し、時間が経つにつれて、MySQL エンジニアリング チームは、キャッシュを有効にしてもメリットがあまりないことに気付きました。

まず、クエリ キャッシュの効果はキャッシュ ヒット率に依存します。キャッシュにヒットしたクエリのみが改善できるため、そのパフォーマンスを予測することはできません。

2 番目に、クエリ キャッシュのもう 1 つの大きな問題は、単一のミューテックスによって保護されていることです。多数のコアを持つサーバーでは、クエリの数が多くなると、ミューテックスの競合が多発する可能性があります。

ベンチマークの結果、ほとんどのワークロードはクエリキャッシュを無効にすることで最適に処理されることがわかりました(5.6のデフォルト):query_cache_type = 0

クエリ キャッシュが役立つと思われる場合は、それに応じてテストしてください。

  • 書き込むデータが増えるほど、得られるメリットは少なくなります
  • バッファ プールに保持するデータが増えるほど、得られるメリットは少なくなります。
  • クエリが複雑になるほど、スキャン範囲が広くなり、メリットも大きくなります。

MySQL 8.0 がクエリ キャッシュをキャンセルするもう 1 つの理由は、調査により、キャッシュがクライアントに近いほどメリットが大きくなることが示されているためです。この調査の詳細については、https://proxysql.com/blog/scaling-with-proxysql-query-cache/ を参照してください。

以下の画像は上記の URL からのものです。

さらに、MySQL 8.0 ではパフォーマンス介入のための新しいツールが追加されました。たとえば、クエリ書き換えプラグインを使用して、アプリケーションを変更せずにオプティマイザヒント文を挿入できるようになりました。あるいは、中間キャッシュとして機能できる ProxySQL などのサードパーティ ツールもあります。

上記の理由により、MySQL 8.0 ではクエリ キャッシュがサポートされなくなりました。5.7 から 8.0 にアップグレードする場合は、クエリ リライトまたはその他のキャッシュの使用を検討してください。

全文は以上です。

以上がMySQLがQuery Cacheをキャンセルした理由の詳細です。MySQL Query Cacheの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください。

以下もご興味があるかもしれません:
  • MySQL クエリ キャッシュのグラフィカルな説明
  • MySQL 最適化 query_cache_limit パラメータの説明
  • MySQL キャッシュの起動方法とパラメータの詳細 (query_cache_size)
  • MySQL query_cache に関する誤解
  • MySQLクエリキャッシュ原理の分析
  • MySQL query_cache_type パラメータと使用方法の詳細

<<:  MySQL IFNULL判定問題の解決方法

>>:  Web インタビュー Vue カスタム コンポーネントと呼び出しメソッド

推薦する

MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析

前書き: MySQL でテーブルを設計する場合、MySQL では UUID や非連続かつ非繰り返しの...

MySql 範囲内の検索時にインデックスが有効にならない理由の分析

1 問題の説明この記事では、確立された複合インデックスをソートし、レコード内の非インデックス フィー...

CSS XTHML の記述標準とよくある問題の概要 (ページ最適化)

プロジェクトドキュメントディレクトリDiv+CSS 命名規則 - 4 - Div+css 命名規則 ...

Mysql接続数の設定と取得方法

接続数を取得する --- 最大接続数を取得します。SHOW VARIABLES LIKE '...

CSS3で線形グラデーションを実装するためのコードの詳細な説明

序文デモでは古いバージョンのブラウザのグラデーションが実装されています[IE9-]。 IE9 より前...

Vue diffアルゴリズムの完全な分析

目次序文Vue 更新ビューパッチ同じVノードパッチVノード更新子供序文Vue は仮想 DOM を使用...

MySQLが日付フィールドインデックスを使用しない理由の要約

目次背景探検する要約する背景テーブルでは、dataTime フィールドは varchar 型に設定さ...

element-plus でオンデマンドインポートとグローバルインポートを実装する方法

目次オンデマンドインポート:グローバルインポートオンデマンドインポート:プラグインをインストールする...

CSS スタイルの優先順位とカスケード順序に関する議論

一般的に: [重要なフラグ1つ] > [特別なフラグ4つ] > 宣言順!importan...

Linux システム構成 (サービス制御) の詳細な紹介

目次序文1. システムサービス制御1. システムctl 2. ターゲット3. 共通システムサービス4...

17 個の JavaScript ワンライナー

目次1. DOMとBOM関連1. 要素にフォーカスがあるかどうかを確認する2. 要素の兄弟ノードをす...

JQuery を放棄すべきでしょうか?

目次序文jQuery 以外の場合は何を使うのでしょうか? DOMとイベントAJAX リクエスト要約す...

JavaScript でロジック判定コードを最適化する方法

序文日常生活で使用する論理的判断文には、if...else...、switch...case...、...

MySQL GTID の総合概要

目次01 GTIDの紹介02 GTIDの仕組み03 GTIDの利点と欠点04 テスト環境構築05 テ...

Nginx+SSL による双方向認証を実装するためのサンプル コード

まずディレクトリを作成する cd /etc/nginx mkdir ssl cd ssl CA と自...