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プラグインの問題を解決するいくつかの方法

推薦する

JavaScript関数の詳細な説明これを指す問題

目次1.関数内のこの方向1. 通常の機能2. コンストラクター3. オブジェクトメソッド4. イベン...

QT が MYSQL データベースに接続するための詳細な手順

最初のステップは、対応するデータベースモジュール(sql)をプロジェクトファイル( .pro )に追...

Centos6.6 で php7 + nginx 環境をインストールする方法

この記事では、centos6.6 で php7 + nginx 環境をインストールする方法について説...

win2008 で mysql8.0.11 を mysql8.0.17 にアップグレードする詳細な手順

アップグレードの背景: MySQLの下位バージョンの脆弱性を解決するために、MySQLはMySQL ...

ネイティブ JS カプセル化 vue タブ切り替え効果

この記事の例では、ネイティブJSカプセル化vueタブ切り替えの具体的なコードを参考までに共有していま...

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

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

Docker swarm の簡単なチュートリアル

3つの仮想マシン132、133、134を群がらせる1. クラスターを初期化し、自分自身をクラスターに...

Dockerを使用してJenkinsをインストールする方法

目次1. イメージをプルする2. ローカルデータボリュームを作成する3. コンテナを作成する4. J...

JavaScriptの原理と方向性

これが何を指しているのかをどのように判断するのでしょうか? ①グローバル環境で呼び出された場合はwi...

JS のオブジェクトリテラルの詳細な説明

目次序文1. オブジェクト構築にプロトタイプを設定する1.1 __proto__ の使用における特殊...

純粋なCSSを使用してスイッチ効果を実現する

まずアイデアはこの効果を実現するには、 <input type="checkbox&...

Vue で rem 適応を使用する方法

1. 開発環境vue 2. コンピュータシステム Windows 10 Professional E...

ウェブページの最も基本的なコード

◆お気に入りに追加例示するクリックすると、ブラウザのお気に入りメニューにウェブサイトが追加されます...

Tcl言語に基づくシンプルなネットワーク環境を構成するプロセスの分析

1. Tclスクリプトファイルcircle.tclコードコメント #シミュレーションに必要なプロパテ...

HTML独習の旅(I)基本要素と属性の練習(自分でコードを書く)

私は W3school のチュートリアルに従いました。チュートリアルはとても良いと思います。各セクシ...