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のインストールチュートリアル

推薦する

MYSQL スロークエリとログの例の説明

1. はじめにスロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメン...

...

Vue は Axios リクエスト フロントエンドのクロスドメイン問題をどのように解決するのか

目次序文1. クロスドメインの問題はなぜ発生するのでしょうか? 2. 解決策クロスオリジンリソース共...

JavaScript におけるブラウザ互換性の問題について簡単に説明します

ブラウザの互換性は、実際の開発では見落とされがちな最も重要な部分です。古いバージョンのブラウザの互換...

MySql ファジークエリ JSON キーワード取得ソリューションの例

目次序文オプション1:オプション2:オプション3:オプション4(最終的に採用されたオプション):要約...

Docker で Spring-boot プロジェクトをデプロイするためのサンプル コード

1. 基本的な Spring-boot クイックスタート1.1 クイックスタート pom.xml は...

この記事ではJavaScriptのガベージコレクションの仕組みを説明します

目次1. 概要2. メモリ管理3. ガベージコレクション4. GCアルゴリズムの紹介5. 参照カウン...

MySQL 8.0.11 Community Green Edition の Windows 用インストール手順図

このチュートリアルでは、インストールに最新の MySQL コミュニティ グリーン バージョンである ...

CSSはグラデーションを巧みに利用して高度な背景光アニメーションを実現します

成し遂げるこの効果は CSS を使用して完全に再現することは困難です。 CSS でシミュレートされた...

JSX を使用してカルーセル コンポーネントを実装する方法 (フロントエンドのコンポーネント化)

JSX を使用してコンポーネント システムを構築する前に、例を使用してコンポーネントの実装原理とロ...

数千万のMySQLデータ量を素早くページ分割する方法

序文バックエンド開発では、一度に大量のデータがロードされ、メモリやディスク IO のオーバーヘッドが...

MySQL 8.0.11 圧縮版のインストールチュートリアル

この記事では、MySQL 8.0.11のインストールチュートリアルを参考までに紹介します。具体的な内...

CentOS 7 ブートカーネルの切り替えとブートモードの切り替えの説明

Centos7 スイッチブートカーネル注: 必要に応じて、最初にyum update -yを実行して...

JavaScriptとTypeScriptの関係

目次1. JavaScript とは何ですか? 2. JavaScript は何に使用されますか? ...