ホームページ データベース mysql チュートリアル MySQLデータベースの前処理(プリペアドステートメント)パフォーマンステストのご紹介

MySQLデータベースの前処理(プリペアドステートメント)パフォーマンステストのご紹介

Feb 04, 2021 am 09:03 AM
mysql

MySQLデータベースの前処理(プリペアドステートメント)パフォーマンステストのご紹介

無料学習の推奨事項: mysql ビデオ チュートリアル

#1. 前処理は何を行いますか

# データベース ステートメントを送信すると、そのステートメントはデータベース サービスに到達し、データベース サービスは SQL ステートメント (構文など) を解析する必要があります。チェックすると、クエリ条件が最初に最適化されてから実行されます。前処理では、簡単に言えば、クライアントとデータベース サービスの間の元の対話が 2 回に分割されます。まず、データベース ステートメントを送信し、最初にデータベース サービスにステートメントを解析させます。次に、パラメータを送信し、ステートメントを呼び出して実行します。このようにして、複数回繰り返し実行されるステートメントの場合、データベース ステートメントを一度送信して解析し、解析されたばかりのステートメントを継続的に呼び出して実行できます。これにより、同じステートメントを複数回解析する時間を節約できます。効率を向上させるという目的を達成するため。

前処理ステートメントはプレースホルダー (プレースホルダー) をサポートしており、パラメーターはプレースホルダーをバインドすることによって送信されます。非常に重要な点は、プレースホルダーにバインドできるのは値のみであり、SQL ステートメントの一部のキーワードではないということです。たとえば、ステートメント: 「select * from Student where students.id = ?」。プレースホルダ (?) が "1 or 1=1" の場合、"1 or 1=1" は値とみなされ、つまり " 記号で囲まれたものとみなされます。最終的に、この不正なステートメントはエラーになります。これにより、SQL インジェクション (SQL インジェクション) の脆弱性が回避されます。

前処理メカニズムの 3 つの主なステップ:

1. ステートメントを前処理します

2. ステートメントを実行します

3. 前処理ステートメントを破棄します。

2. `performance_schema`.`prepared_statements_instances` テーブルの概要

SQL スクリプトを実行します: '%prepare%' のようなグローバル変数を表示します。 「

performance_schema_max_prepared_statement_instances

というシステム変数が表示されます。値 0 は、プリペアド ステートメントのパフォーマンス データ レコード テーブルが有効になっていないことを意味します `performance_schema`.`prepared_statements_instances`; -1 は、レコードの数が動的に処理されることを意味します; 他の正の整数値は、performance_schema_max_prepared_statement_instances を表します最大レコード数 項目数。 テーブル `performance_schema`.`prepared_statements_instances` とは何ですか?これは、準備されたステートメントのいくつかの基本情報とパフォーマンス データを記録するために使用されます。たとえば、準備済みステートメントの ID、準備済みステートメントの名前、準備済みステートメントの具体的なステートメントの内容、準備済みステートメントの実行回数、各実行にかかる時間、各準備済みステートメントが実行されたスレッド ID などです。ステートメントが属するなど準備されたステートメントを作成すると、データの一部がこのテーブルに挿入されます。 Prepared Statement は接続に基づいており、接続が切断されると、Prepared Statement は自動的に削除されます。ただし、「performance_schema」.「prepared_statements_instances」テーブルはグローバルであり、データベース接続とは何の関係もありません。このデータを使用すると、1. コード内で実行されるステートメントが実際に前処理されているかどうか、2. 前処理されたステートメントの実行を理解することで、ビジネスでステートメントを前処理する必要があるかどうかを判断できます。

3. qt prepare 関数の説明

私自身のプロジェクトのニーズに基づいて、このテストのクライアント コードは Qt を使用します。ここには重要な関数、QSqlQuery クラスの prepare 関数が記録されています。準備関数を呼び出すことは、準備されたステートメントを作成するコマンドをデータベースに送信することです。これは、通話中にデータベース サービスとの対話が行われることを意味します。同じ QSqlQuery クラス オブジェクトが 2 回目に prepare を呼び出すと、最初の prepare 呼び出しで作成されたプリペアド ステートメントは削除され、2 つのプリペアド ステートメントがまったく同じである場合でも、プリペアド ステートメントが作成されることに注意してください。同じ。 QSqlQuery の exec 関数を呼び出すと、QSqlQuery によって以前に作成された準備済みステートメントも削除されます。したがって、クエリの最後に接続が閉じられるか、クエリが他のステートメントを実行すると、その結果、`performance_schema`.`prepared_statements_instances` テーブルには関連するプリペアド ステートメントのレコードがなくなり、プリペアド ステートメントが作成されたと誤って信じられます。準備されたステートメントが失敗しました。実際、Qt のアプローチにより、準備されたステートメントを手動で削除する手間も省けます。

4. 実験的推測

定期的に実行されるステートメントと前処理後に実行されるステートメントの違いは、複数実行の場合、前処理されたステートメントは Parse のみを必要とすることです。 SQL ステートメントを 1 回実行した後、パラメーターの送信とパラメーターのバインドにさらに時間を費やします。準備されたステートメントは結果を返すときにバイナリ転送プロトコルを使用しますが、通常のステートメントはテキスト形式の転送プロトコルを使用します。そこで、以下のような推測を立てて検証してみます。

1. 単純な文を実行する場合、通常の実行と前処理の実行で性能に大きな差はありません。準備されたステートメントは、複雑なステートメントが繰り返し実行される場合にのみ利点を発揮します。

2. クエリ結果セットが大量のデータである場合、準備されたステートメントはパフォーマンス上の利点を示します。

5. 実験データ記録

です の .taskId ##9 は select * from task where task.taskId = ? 10#11 isselect * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like '%s%' and b.file_id > ; 100000 および b.file_id No2100036612いいえselect * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like '%s%' and b.file_id > 100000 and b.file_id No21000380

6. 結論

実験データの結果は私が予想していたものとは少し異なりましたが、テストコードとテストプロセスを繰り返し検証した結果、次のことが確認されました。テスト自体には問題ありません。実験データを尊重して、次の結論を導き出します。

1. 実験 5 と 6 を比較し、実験 11 と 12 を比較することにより、推測 1 が間違っていると結論付けることができます。結論は次のようになります。 単純なステートメントと複雑なステートメントでは、MySQL の前処理と通常のクエリの間にパフォーマンスに大きな違いはありません。

2. 実験 1 と実験 2 を比較し、実験 7 と実験 8 を比較すると、推測 2 は間違っていると結論付けることができます。結論は次のようになります。

MySQL 前処理の結果と従来のクエリとの間には、データ送信におけるパフォーマンスに大きな差はありません。

3. さらに、リモート データベースとローカル データベースの実験データを比較します。 MySQL データベースは、ローカルでのデータ操作のパフォーマンスを大幅に向上させると結論付けることができます。

#関連する無料学習の推奨事項:

mysql データベース(ビデオ)

シリアル番号 前処理するかどうか ステートメント リモート データベースかどうか 返されるデータの量 各実験ステートメントの合計実行数 3 つの実験の平均合計消費時間/単位はミリ秒
1 select * from task where (?) の task.taskId は 1000 1000 69822
2 No select * from task where task (arr) is 1000 1000 66778
3is select * from task where task.taskId = ? = 1 1000 1260
4 No select * from task where task.taskId = id Yes 1 1000 951
5 is select * from タスク a LEFT JOIN task_file b ON a。 taskId = b.task_id ここで、「%s%」のような .taskName、b.file_id > 100000、および b.file_id はい 2 1000 2130
6 いいえ select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like '%s%' and b.file_id > 100000 and b.file_id #2 1000 1480
7 Yes select * from task where task.taskId in (?) No 1000 1000 57051
8 No select * from task where task.taskId in (arr) No 1000 1000 56235
#No 1 1000 217
No select * from task where task.taskId = id No 1 1000 204

以上がMySQLデータベースの前処理(プリペアドステートメント)パフォーマンステストのご紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL:簡単な学習のためのシンプルな概念 MySQL:簡単な学習のためのシンプルな概念 Apr 10, 2025 am 09:29 AM

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

Navicatプレミアムの作成方法 Navicatプレミアムの作成方法 Apr 09, 2025 am 07:09 AM

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

NavicatでMySQLへの新しい接続を作成する方法 NavicatでMySQLへの新しい接続を作成する方法 Apr 09, 2025 am 07:21 AM

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

MySQLおよびSQL:開発者にとって不可欠なスキル MySQLおよびSQL:開発者にとって不可欠なスキル Apr 10, 2025 am 09:30 AM

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

単一のスレッドレディスの使用方法 単一のスレッドレディスの使用方法 Apr 10, 2025 pm 07:12 PM

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

SQLが行を削除した後にデータを回復する方法 SQLが行を削除した後にデータを回復する方法 Apr 09, 2025 pm 12:21 PM

データベースから直接削除された行を直接回復することは、バックアップまたはトランザクションロールバックメカニズムがない限り、通常不可能です。キーポイント:トランザクションロールバック:トランザクションがデータの回復にコミットする前にロールバックを実行します。バックアップ:データベースの定期的なバックアップを使用して、データをすばやく復元できます。データベーススナップショット:データベースの読み取り専用コピーを作成し、データが誤って削除された後にデータを復元できます。削除ステートメントを使用して注意してください:誤って削除されないように条件を慎重に確認してください。 WHERE句を使用します:削除するデータを明示的に指定します。テスト環境を使用:削除操作を実行する前にテストします。

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

See all articles