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

推薦する

HTML タグでの this の使用法の紹介

例えば:コードをコピーコードは次のとおりです。 <html> <ヘッド> &...

ウェブサイトを黒、白、グレーにする4つのコードの詳細な説明

2008年5月12日に四川省汶川市で発生した地震により、多くの命が失われ、遺憾なことと存じます。国務...

MySQL における exists、in、any の基本的な使い方

【1】存在するループを使用して外部テーブルを 1 つずつクエリし、各クエリの存在する条件ステートメン...

ナビゲーションバーコンポーネントをVueでカプセル化する

はじめに:ナビゲーション バーなどのコンポーネント ベースのアイデアを使用して機能モジュールを完全に...

関連するプロパティのリストを含む HTML エリア イメージ ホットスポットの使用の概要

<area> タグは主にイメージマップで使用されます。イメージマップにアクティブ領域 (...

VMware Workstation 14 Pro は CentOS 7.0 をインストールします

VMware Workstation 14 ProにCentOS 7.0をインストールする具体的な方...

Vue3 コンポジション API の紹介

目次概要例なぜそれが必要なのでしょうか?設定参照、反応的計算して見るライフサイクルVue3.0 は ...

Mysql トランザクション分離レベルの読み取りコミットの詳細な説明

MySQL トランザクション分離レベルを表示する mysql> '%isolation...

element.style インライン スタイルを変更する方法のチュートリアル

序文上記の Web ページ スタイルを記述しているときに、スタイルの値をどのように変更しても、ページ...

MySQLクエリプランでken_lenの値を計算する方法

key_lenの意味MySQL では、次に示すように、explain を使用して SQL ステートメ...

Linuxシステムの操作レベルの詳細な紹介

目次1. Linuxシステムの操作レベルの概要2. 実行レベルを確認する3. 現在のシステムの動作レ...

Vueのミックスインと継承について詳しく説明します

目次序文ミキシンMixin ノート (重複名)ローカルミックスイングローバル ミックスイン継承するミ...

MySQLの日付加算と減算関数の詳細な説明

1. 追加時間()指定した秒数を日付に追加する select addtime(now(),1); -...

Mysqlデータテーブルでワームレプリケーションを使用する方法

簡単に言えば、MySQL ワーム レプリケーションは、クエリされたデータを指定されたデータ テーブル...

Zabbix は DingTalk のアラーム機能を画像付きで設定します

実装のアイデア:まず、アラーム情報にはitemidが必要です。これは前提条件です。情報に渡されるパラ...