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

推薦する

Linuxのwhichコマンドの具体的な使い方

Linux でファイルを見つけたいのに、その場所がわからないことがよくあります。次のコマンドを使用し...

Raspberry Pi msmtp と mutt のインストールと設定のチュートリアル

1. muttをインストールするsudo apt-get install mutt 2. msmtp...

Centos7 のインストールと Mysql5.7 の設定

ステップ1: MySQL YUMソースを取得するMySQLの公式サイトにアクセスして、RPMパッケー...

Windows Server 2008 R2 で忘れたパスワードを処理する方法

Windows Server 2008R2を忘れた場合の対処方法サーバーの数が多すぎる、サーバーが多...

Navicatを使用してクラウドサーバーデータベースにリモート接続する方法

秘密鍵を開かずにリモート サーバーのデータベースに接続するのは非常に便利です。新しい接続でデータを入...

Centos7環境でMySQL 5.6のインスタンスを複数作成する方法の詳細な説明

この記事では、CentOS 7 環境で MySQL 5.6 の複数のインスタンスを作成する方法につい...

MySQL Community Server 5.6.39 のインストール方法

この記事では、MySQLのダウンロードとインストールの詳細なチュートリアルを記載しています。具体的な...

JSインターセプト文字列の3つの方法の詳細な説明

JS には、文字列をインターセプトするための 3 つのメソッド、 slice() 、 substri...

Docker /var/lib/docker/aufs/mnt ディレクトリのクリーニング方法

会社のサービスはdockerを使用しており、ディスクマンが見つかりました。その後、次のコマンドを実行...

JavaScript ドキュメント オブジェクト モデル DOM

目次1. JavaScriptはページ内のすべてのHTML要素を変更できる1. IDでHTML要素を...

Linux/CentOS サーバー セキュリティ構成の一般ガイド

Linux はオープン システムです。インターネット上には、既成のプログラムやツールが多数存在します...

MySQL の 6 つの一般的な制約タイプの詳細な説明

目次序文1.nullでない2. ユニーク3. デフォルト4.主キー自動増分主キー5. 外部キー6.チ...

純粋なCSSを使用してスクロールシャドウ効果を実現します

端的に言うと、スクロール可能な要素には非常によくある状況があります。通常、スクロールすると、要素が現...

HTML でランダムロールコーラーを実装するためのサンプルコード

この点呼装置は簡易版であり、自動停止の必要性を考慮していないため、点呼を開始した後、停止ボタンをクリ...

HTML タグのカスタム属性に関する質問

以前の開発では、クラス、名前などの HTML のデフォルト属性を使用していました。 Huawei社の...