MySQLクエリ書き換えプラグインの使用

MySQLクエリ書き換えプラグインの使用

クエリ書き換えプラグイン

MySQL 5.7.6 以降、MySQL Server は、サーバーが実行する前にサーバーが受信したステートメントを検査し、場合によっては変更できるクエリ書き換えプラグインをサポートしています。

以下は公式文書の紹介です。

事前解析書き換えプラグインには次の機能があります。

1. このプラグインを使用すると、サーバーに到着した SQL ステートメントを、サーバーによって処理される前に書き換えることができます。

2. プラグインはステートメント文字列を受け取り、異なる文字列を返す場合があります。

解析後クエリ書き換えプラグインには、次の特性があります。

1. プラグインは、解析ツリーに基づくステートメントの書き換えをサポートします。

2. サーバーは各ステートメントを解析し、その解析ツリーをプラグインに渡します。プラグインはツリーを走査できます。プラグインは、さらに処理するために元のツリーをサーバーに返すことも、別のツリーを構築してそれを返すこともできます。

一般的に、プラグインは 2 つの書き換え方法をサポートしています。1 つは構文解析前に SQL 文字列を直接変更する方法で、もう 1 つは構文解析後に構文解析ツリーを操作して書き換える方法です。この機能は非常に便利です。たとえば、SQL ステートメントが誤ってアップロードされたが、インデックスが見つからないためにデータベース全体を照会できない場合や、サードパーティのコンパイル済みソフトウェアを使用しているが、SQL ステートメントが誤って実行され、アプリケーションを直接変更できない場合などです。この機能は非常に役立ち、ユーザーの要件を満たすプラグインを作成することもできます。

インストールまたはアンインストール

最も簡単なインストールプロセスは次のとおりです。

shell> mysql -u root -p < install_rewriter.sql パスワードを入力してください: (ここでルートパスワードを入力してください) 

新しいライブラリ query_rewrite がデータベースに追加されたことがわかります。データベースを確認します。

プラグインが現在インストールされているかどうかを確認します。

実際の操作

たとえば、次のステートメントは主キー クエリの使用を強制します。

DBA_no = ? の場合、DBA_inf から DBA_no、name を選択します。

次のように書き直します。

SELECT DBA_no, name from DBA_inf force index(primary) where DBA_no = ?

Rewriter プラグインのルールを追加するには、次の 2 つの手順を実行します。

1. 対応するルールを rewrite_rules テーブルに追加します。

2. flush_rewrite_rules() ストアド プロシージャを呼び出して、テーブル内のルールをプラグインに読み込みます。

次の例では、単一のリテラル値を選択するステートメントに一致する単純なルールを作成し、次のアクションを実行します。

query_rewrite.rewrite_rules(pattern, replacement, pattern_database) に値を挿入します ("SELECT DBA_no, name from DBA_inf where DBA_no = ?","SELECT DBA_no, name from DBA_inf force index(primary) where DBA_no = ?","DBAs");

挿入したばかりのルールを照会します。

出力ルールの各列の内容は次のとおりです。

id:

ルール ID。この列はテーブルの主キーです。この ID は、任意のルールを一意に識別するために使用できます。

パターン:

ルールが一致するステートメント パターンを示すテンプレート。一致したデータ値を示すために ? を使用します。

パターンデータベース:

データベースは、ステートメント内の修飾されていないテーブル名を照合するために使用されます。対応するデータベース名とテーブル名が同じ場合、ステートメント内の修飾されたテーブル名はスキーマ内の修飾された名前と一致します。ステートメント内の修飾されていないテーブル名は、デフォルトのデータベース pattern_database がテーブル名と同じであり、ステートメント名が同じである場合にのみ、スキーマ内の修飾されていない名前と一致します。

交換:

パターン列の値に一致するステートメントを書き換える方法を示すテンプレート。一致するデータ値を示すには ? を使用します。これはパラメータ マーカーであり、実際のステートメント内で置き換えることができます。

有効:

ルールが有効かどうか。ロード操作 (flush_rewrite_rules() ストアド プロシージャを呼び出すことによって実行) により、この列が YES でロードされている場合にのみ、Rewriter はテーブルからインメモリ キャッシュにルールをロードします。この列を使用すると、ルールを削除せずに非アクティブ化することができます。テーブルで列を YES 以外の値に設定し、テーブルをプラグインに再ロードします。

メッセージ:

プラグインはこの列を使用してユーザーと通信します。ルール テーブルをメモリにロードする際にエラーが発生しない場合、プラグインはメッセージ列を NULL に設定します。 NULL 以外の値はエラーを示し、列の内容はエラー メッセージになります。次の場合にエラーが発生する可能性があります: 1. パターンまたは置換が不正な SQL ステートメントであり、構文エラーが発生します。 2. 置換にはパターンよりも多くのパラメータ マーカーが含まれています。ロード エラーが発生した場合、プラグインは Rewriter_reload_error ステータス変数も ON に設定します。

パターンダイジェスト:

この列はデバッグと診断に使用されます。ルール テーブルがメモリにロードされたときに列が存在する場合、プラグインはスキーマ サマリーを使用して列を更新します。この列は、特定のステートメントを書き換えることができなかった理由を判断するのに役立ちます。

正規化されたパターン

この列はデバッグと診断に使用されます。ルール テーブルがメモリにロードされたときに列が存在する場合、プラグインはそれをスキーマの正規化された形式で更新します。この列は、特定のステートメントを書き換えることができなかった理由を判断する場合に役立ちます。

リライタクエリ書き換えプラグインプロセス

rewrite_rules テーブルにルールを追加するだけでは、Rewriter プラグインがそのルールを使用するのに十分ではありません。テーブルの内容をプラグインのメモリ キャッシュにロードするには、flush_rewrite_rules() も呼び出す必要があります。

Rewriter プラグイン操作では、ストアド プロシージャを使用して、ルール テーブルをメモリ キャッシュに読み込みます。通常の操作では、ユーザーは flush_rewrite_rules() を呼び出して、rewrite_rules テーブルの内容を Rewriter メモリ キャッシュに読み込むだけです。テーブルをロードした後、クエリ キャッシュもクリアされます。

ルール テーブルが変更された場合、プラグインが新しいテーブルの内容からキャッシュを更新できるように、このプロシージャを再度呼び出す必要があります。

書き換えプラグインで定義されたステートメント パターンを使用して、対応するレコードをクエリします。

DBA_no =8 の場合、DBA_inf から DBA_no、名前を選択します。 

explain文を使用することで、現在のSQLはインデックスを使用しています

プラグイン操作情報を書き換える

Rewriter プラグインは、いくつかのステータス変数を通じてその動作に関する情報を提供します。

これらの変数に関する注記:

  • Rewriter_number_loaded_rules: Rewriter プラグインで使用するために rewrite_rules テーブルからメモリに正常にロードされた書き換えプラグイン書き換えルールの数。
  • Rewriter_number_reloads: rewrite_rules が Rewriter プラグイン キャッシュにロードされる回数。
  • Rewriter_number_rewritten_queries: Rewriter クエリ書き換えプラグインがロードされてから書き換えられたクエリの数。
  • Rewriter_reload_error: 最近 Rewriter プラグインによって使用されたメモリ内キャッシュに rewrite_rules テーブルをロード中にエラーが発生したかどうか。値が OFF の場合、エラーは発生しません。値が ON の場合、エラーが発生します。rewriter_rules テーブルの message 列でエラー メッセージを確認してください。

flush_rewrite_rules() ストアド プロシージャを呼び出してルール テーブルをロードするときに、一部のルールでエラーが発生すると、CALL ステートメントによってエラーが生成され、プラグインによって Rewriter_reload_error ステータス変数が ON に設定されます。

この場合、rewrite_rules テーブルで NULL 以外のメッセージ列値を含む行をチェックして、問題が何であるかを確認します。

リライタプラグインは文字セットを使用します

rewrite_rules テーブルが Rewriter プラグインにロードされると、プラグインは character_set_client システム変数の現在のグローバル値を使用してステートメントを解釈します。その後、character_set_client がグローバル値を変更する場合は、ルール テーブルを再ロードする必要があります。

クライアントのセッション character_set_client 値は、ルール テーブルがロードされたときのグローバル値と同じである必要があります。そうでない場合、ルールの一致はそのクライアントに適用されません。

上記は、MySQL クエリ書き換えプラグインの使用に関する詳細な内容です。MySQL クエリ書き換えプラグインの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Zabbix の Percona プラグインを使用して MySQL を監視する方法
  • Spring mvcはmybatis(crud + ページングプラグイン)を統合してmysqlを操作する
  • パスワードの強度を高めるためにMySql5.6でパスワード検証プラグインをインストールして使用する方法
  • MySQL パスワード強化プラグイン
  • MySQL の InnoDB 用 Memcached プラグインの使用に関するチュートリアル
  • MySQL の InnoDB エンジンの Memcached プラグインの詳細な説明
  • MySQL HandlerSocket プラグインのインストールと設定のチュートリアル
  • 支払いPHPスパイダー統計プラグインはMySQLがある限り使用できます
  • 支払いPHPスパイダー統計プラグインはMySQLがある限り使用できます
  • MySQL 接続制御プラグインの紹介

<<:  CentOS7 で docker を使用して Apollo 構成センターをデプロイする実装

>>:  LinuxでのDockerのインストールチュートリアル

推薦する

proxy_pass を設定した後に Nginx が 404 を返す問題を解決する

目次1. proxy_pass を設定した後に Nginx が 404 を返す問題のトラブルシューテ...

ウェブページの画像最適化ツールと使用方法のヒントの共有

ウェブページの基本要素として、画像はページの読み込み速度に影響を与える重要な要素の 1 つです。画像...

Vue の基本リスナーの詳細な説明

目次Vueのリスナーとは何かリスナーの使い方vue リスナーウォッチVue リスナー - ディープリ...

Docker 実行オプションを使用して Dockerfile の設定を上書きする

通常は、最初に Dockerfile ファイルを定義し、次に docker build コマンドを使...

MySQL の悲観的ロックと楽観的ロックの使用例

悲観的ロック悲観的ロックは、データを悲観的であるとみなします。データをクエリするときに、ロックを追加...

MySQL の 3 つの Binlog 形式の概要と分析

1つ。 Mysql Binlog フォーマットの紹介 Mysql binlog ログには、State...

html mailto(メール)の実用化について

ご存知のとおり、mailto は Web デザインと制作において非常に実用的な HTML タグです。...

Vueはユーザーログインとトークン検証を実装します

フロントエンドとバックエンドを完全に分離する場合、Vue プロジェクトでトークン検証を実装する一般的...

JavaScript で円形のプログレスバー効果を実装する

この記事では、円形のプログレスバー効果を実現するためのJavaScriptの具体的なコードを参考まで...

モバイルデバイス用のメタタグ設定の完全なリスト

序文以前フロントエンドを勉強していたとき、メタタグに対する私の理解はこの一文だけでした。 <メ...

threejs でリアルタイムポリゴン屈折を実装する方法

目次序文ステップ1: セットアップと前方屈折ステップ2: 反射とフレネル方程式ステップ3: 多面屈折...

Linux lessコマンド例の詳細な説明

ファイル名が少ないファイルを表示ファイル名を少なく | grep -n コンテンツを検索内容に応じて...

GET POSTの違い

1. Get はサーバーからデータを取得するために使用され、Post はサーバーにデータを渡すために...

JavaScript Canvas は動的なワイヤーフレーム効果を描画します

この記事では、JavaScript Canvasの動的なワイヤーフレーム効果を描画する具体的なコード...

JavaScript におけるイベント バブリング メカニズムの詳細な分析

バブリングとは何ですか? DOM イベント フローには、イベント キャプチャ ステージ、ターゲット ...