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

推薦する

Docker Composeのデプロイと基本的な使い方の詳しい説明

1. Docker Composeの概要Compose は、マルチコンテナ Docker アプリケー...

Vue の動的メニュー、動的ルートの読み込みと更新の落とし穴

目次必要:アイデア:レッスン:テキストを共有する:要約する必要:インターフェイスからサブメニュー デ...

フロントエンドのパフォーマンス最適化を学習するための準備として、HTML ページのレンダリング プロセスを理解する (続き)

昨夜、ブラウザのレンダリングプロセスに関するエッセイを書きましたが、小さなコードで説明しただけでした...

よく忘れられがちな CSS のヒント 26 選

これは、よく使われるけれども忘れられがちな CSS 実装方法のコレクションです。抜けや追加があれば、...

Vueのシンプルな状態管理ストアモードを理解する方法

目次概要1. store.jsを定義する2. store.js を使用するコンポーネント3. 成果を...

Vueは大画面ページのスクリーン適応を実現します

この記事では、大画面ページのスクリーンアダプテーションを実現するためのVueの具体的なコードを参考ま...

js オプション連鎖演算子の使用

序文オプションの連鎖演算子 (?.) を使用すると、チェーン内の各参照が有効であることを明示的に検証...

MySQL サービスに iptables ファイアウォール ポリシーを追加するためのソリューション

MySQL データベースが Centos7 システムにインストールされており、オペレーティング シス...

Docker マイクロサービス用の ETCD クラスターの構築に関する詳細なチュートリアル

目次etcdの機能etcdが独自の高可用性クラスタを構築するには、主に3つの形式があります。今回構築...

シェルスクリプトはNginxのaccess.logのPVを定期的にカウントし、APIに送信してデータベースに保存します。

1. PVとIPの統計一日のPV(ページビュー)をカウントする cat access.log | ...

MySQLデータベースはsysbenchに基づくOLTPベンチマークテストを実装します

Sysbench は、MySQL データベース ストレージ エンジン InnoDB のディスク I/...

Docker swarm を使用して Nebula Graph クラスターを迅速にデプロイする方法のチュートリアル

1. はじめにこの記事では、Docker Swarm を使用して Nebula Graph クラスタ...

mySQLキーワードの実行優先度の説明

以下のように表示されます。表から条件フィールドでグループ化仮想テーブルとフィールドを作成し、フィール...

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

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

MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明

目次ストレージエンジンのメモリ管理データ ページを LRU キューの先頭に置かないのはなぜですか?ダ...