Mysqlのprepare前処理の具体的な使用法

Mysqlのprepare前処理の具体的な使用法

MySQL PREPARE 前処理テクノロジの意義は、サーバへの負担を軽減するテクノロジであることです。

つまり、ほとんどの場合、ある要件に対する特定の SQL 文が繰り返し呼び出されて実行されるか、または個々の値のみが実行されるたびに異なる可能性があります。
例えば:

  • SELECT の WHERE 句の値が異なります。
  • UPDATE の SET 句の値が異なります。
  • INSERTのVALUES値が異なります。
    上記の字句意味解析、ステートメント最適化、実行計画策定などが毎回必要になると、効率が大幅に低下します。

1. 前処理

MySQL は、前処理と呼ばれるサーバー側の準備済みステートメントのサポートを提供します。

このサポートは、効率的なクライアント/サーバー バイナリ プロトコルを活用します。パラメータ値のプレースホルダーを含む準備済みステートメントを使用すると、次の利点が得られます。

  • 実行されるたびにステートメントを解析する際のオーバーヘッドを削減します。通常、データベース アプリケーションは、クエリと削除の場合は WHERE、更新の場合は SET、挿入の場合は VALUES などの句内のリテラル値または変数値のみを変更して、ほぼ同一のステートメントを大量に処理します。
  • SQL インジェクション攻撃を防ぎます。パラメータ値には、エスケープされていない SQL 引用符と区切り文字を含めることができます。

前処理インターフェース

1. アプリケーションでの準備済みステートメント C プログラム用の MySQL C API クライアント ライブラリ、Java プログラム用の MySQL Connector/J、および MySQL などのクライアント プログラミング インターフェイスを通じて、サーバー側の準備済みステートメントを使用できます。 NET テクノロジー プログラム MySQL Connector/NET。たとえば、C API は、準備されたステートメント API を構成する一連の関数呼び出しを提供します。

2. SQL スクリプト内の準備済みステートメント 準備済みステートメント用の代替 SQL インターフェイスもあります。ただし、プログラミングは必要ありません。SQL レベルで直接使用でき、mysql クライアント プログラムなど、SQL ステートメントをサーバーに送信して実行できる任意のプログラムで使用できます。

2. 前処理塗布方法

準備されたステートメントの SQL 構文は、次の 3 つの SQL ステートメントに基づいています。

  • PREPARE ステートメントは実行の準備をします。
  • EXECUTE は準備されたステートメントを実行します。
  • DEALLOCATE PREPARE は準備されたステートメントを解放します。

A. 例:

準備されたステートメントはセッション間で使用できません。

mysql>テーブル `t1` を作成します (
  `id` int NULLではない、
   名前varchar(20),
キー `idx_id` (`id`)
) エンジン=InnoDB ;
 
mysql> t1(id,name) に値 (1,'A'),(2,'B'),(3,'C'),(4,'D'),(5,'E'),(6,'F'); を挿入します。
 
#準備されたステートメントを設定します。mysql>PREPARE stmt1 FROM 'SELECT * FROM t1 WHERE a=? ';
 
#転送変数を設定します。mysql>SET @a = 8;
 
#ステートメントの実行mysql>EXECUTE stmt1 USING @a;
 
# 準備されたステートメントを解放します。mysql>DEALLOCATE PREPAR stmt1;

B. 実行計画の変更を追跡するための前処理

ステータス インジケーター Select_scan (実行された全テーブル検索クエリの数) の変化を観察することで、データ量が影響を受けているかどうかを判断できます。

画像.jpg

データ量が変化すると、前処理された SQL ステートメントの実行プランも変化します。

C. ストアドプロシージャには前処理が含まれている

準備されたステートメント ストアド ルーチン内で準備されたステートメントを作成した場合、ストアド ルーチンが終了してもそのステートメントは解放されません。

区切り文字 //
 
proc_prepared が存在する場合はプロシージャを削除します。
プロシージャ proc_prepared() を作成する
始める
INT を宣言します。
i INT を宣言します。
PREPARE stmt1 FROM 'SELECT * FROM t1 WHERE id>? ';
SET @a = 5;
@a を使用して stmt1 を実行します。
終わり //
 
区切り文字 ;
 
proc_prepared() を呼び出す。
ストアド プロシージャの後、準備されたステートメントが個別に呼び出され、結果セットが返されます。これは、前処理によって SET @a = 5 が破棄されなかったことを示します。
@a を使用して stmt1 を実行します。
+----+------+
| ID | 名前 |
+----+------+
| 6 | 女 |
。 。 。

ストアドプロシージャの後、準備されたステートメントが個別に呼び出され、結果セットが返されます。これは、前処理が破棄されないことを意味します。

SET @a = 5; EXECUTE stmt1 USING @a; +----+------+ | id | NAME | +----+------+ | 6 | F | 。。。

D. プロファイルを通じてステートメントの解析コストを表示する

さまざまなステートメントの実行時間をプロファイリングすることで、ステートメントの解析にかかる時間は 0.01 秒以内になります。無視できます。
したがって、現時点では前処理に明らかな利点は見つかっていない。

画像.jpg

3. まとめ

プリコンパイルの初期の役割:

  • 効率を向上: 事前に分析、チェック、コンパイルを実行します。
  • セキュリティの向上: SQLインジェクションの防止

制限と実際の効果:

  • 前処理はセッション レベルに制限されているため、現時点ではその真の価値を反映できません。 MySQL GAバージョンにはスレッドプールの概念がないため、各接続は各セッションになります。
  • コンパイルされたステートメントを解析するオーバーヘッドは、MySQL 環境では基本的に無視できます。
  • 実行プランもデータ量に応じて変化します。

その限界と実際の効果から判断すると、現在は期待通りに機能していない。音場環境での使用には適していません。

これで、MySQL prepare プリプロセスの具体的な使用法に関するこの記事は終了です。MySQL prepare プリプロセスのより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL で準備、実行、割り当て解除ステートメントを使用するチュートリアル
  • MySQL の使用法とバグ分析のプロセスを準備する

<<:  フレックスレイアウトではサブアイテムの高さを維持できる

>>:  Jenkins統合Dockerプラグインの問題を解決するいくつかの方法

推薦する

CSS3は円錐グラデーション効果を実現します

文法:背景画像: 円錐グラデーション(位置の角度から、開始色、...、最後の色)最初のパラメータ:開...

VMWARE で Centos8 仮想マシンをコピーすることによって発生する IP 損失の問題の解決策

VMwareでcentos8サービスをインストールしてコピーすると、次の問題が発生します。 コピー前...

CentOS 8/RHEL 8 に Cockpit をインストールして使用する方法

Cockpit は、CentOS および RHEL システムで使用できる Web ベースのサーバー管...

MySQLからMariaDBへのスムーズな移行のための詳細な手順

1. MariaDB と MySQL の紹介1. MariaDB の紹介MariaDB は、MySQ...

カレンダーウィジェットのネイティブJS実装

この記事の例では、カレンダーウィジェットを実装するためのjsの具体的なコードを参考までに共有していま...

画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...

W3C チュートリアル (9): W3C XPath アクティビティ

XPath は、XML ドキュメントの一部を選択するための言語です。 XPath は、XSLT、XQ...

Tomcat のメモリ構成の正しい姿勢についての簡単な説明

1. 背景多くのブログや記事を読みましたが、JVM のメモリ割り当て方法に関する包括的な記事は見つか...

Dockerイメージの圧縮と最適化操作

Docker が今日非常に人気がある理由は、主にその軽量性、迅速な展開、およびリソースの利用にありま...

フロントエンドJavaScriptの約束

目次1. Promiseとは何か2. 基本的な使い方3. Promiseメソッド3.1 Promis...

Windows に WSL をインストールして構成する方法

WSLとはBaidu 百科事典からの一節を引用します。 Windows Subsystem for ...

mysql 8.0.12 winx64 のダウンロードとインストールのチュートリアル

MySQL 8.0.12のダウンロードとインストールのチュートリアルは参考までに、具体的な内容は次の...

nginx ssl を設定して https アクセスを実装する手順 (初心者向け)

序文サーバーを展開した後、私は大きな喜びを感じながら自分の Web サイトにアクセスし、見たものすべ...

JSはUUIDとNanoIDというユニークなIDメソッドを生成します

目次1. NanoIDがUUIDに取って代わる理由2. jsを生成する方法3. ナノID方式序文:ユ...

arcgis.js は、マップ本体の表示範囲を制御し、領域を超えた場合に自動的にバウンスするようにします (実装のアイデア)

目次背景効果アイデア背景少し前に、会社のプロジェクトで問題が発生しました。地図のベースマップ領域の範...