ホームページ データベース mysql チュートリアル データベース SQL 選択クエリの仕組み

データベース SQL 選択クエリの仕組み

Nov 24, 2016 am 11:35 AM
mysql mysqlデータベース

私はプロの DBA ではありませんが、B/S アーキテクチャを持つ開発者として、常にデータベースと切り離せない存在です。通常、開発者は SQL の 4 つの古典的なステートメント (select、insert、delete、update) のみを使用します。しかし、私はそれらがどのように機能するのかを一度も勉強したことがありません。この記事では、データベース内で select がどのように機能するかについて話したいと思います。

B/S アーキテクチャの最も古典的なトピックは、3 層アーキテクチャに他なりません。これは、データ層、ビジネス ロジック層、プレゼンテーション層に大別できます。データ層の役割は、一般にデータベースと対話することです。レコードのクエリなど。多くの場合、クエリ SQL を作成し、その SQL を実行するプログラムを呼び出します。しかし、その内部ワークフローはどうなっているのでしょうか?最初にどのステップを実行するか、次にどのステップを実行するかなど、ほとんどの友人は私と同じように確信が持てないと思います。

データベース SQL 選択クエリの仕組み

ステップ 1: アプリケーションは実行のためにクエリ SQL ステートメントをサーバーに送信します

データ層で SQL ステートメントを実行すると、アプリケーション プログラムは対応するデータベース サーバーに接続し、SQL ステートメントを送信します処理のためにサーバーに送信されます。

ステップ 2: サーバーは要求された SQL ステートメントを解析します

1. クエリ アナライザーをよく使用する友人は、クエリ ステートメントを実行するときに特に長時間実行する必要があることを知っているでしょう。ただし、同じステートメントをすぐに実行するか、一定期間内に実行すると、クエリ結果は短時間で返されます。

理由:

サーバーは、クエリ要求を受信した後、すぐにデータベースにアクセスしてクエリを実行するのではなく、データベース内のプラン キャッシュを調べて、対応する実行プランがあるかどうかを確認します。実行プランはコンパイルされたものを直接呼び出しますので、実行プランのコンパイル時間が節約されます。

クエリされた行がデータ バッファー記憶域にすでに存在する場合、物理ファイルをクエリする必要はありませんが、データはキャッシュからフェッチされます。この方法では、メモリからデータをフェッチする方が読み取りよりもはるかに高速になります。ハードディスクからのデータの取得、向上 クエリ効率を向上させるために、データ バッファの格納領域については後述します。

2. SQL プラン キャッシュに対応する実行プランがない場合、サーバーはユーザーが要求した SQL ステートメントの構文検証を最初に実行し、構文エラーがある場合、サーバーはクエリ操作を終了し、対応するエラーメッセージを呼び出し側アプリに送信します。

注: この時点で返されるエラー メッセージには、select と書かれた select などの基本的な構文エラー情報のみが含まれます。エラー メッセージにリストにない列が含まれている場合、サーバーはこの時点ではチェックしません。単なる構文検証であるため、セマンティクスが正しいかどうかは次のステップに委ねられます。

3. 構文が一致したら、そのセマンティクスが正しいかどうか、たとえば、テーブル名、列名、ストアド プロシージャなどのデータベース オブジェクトが実際に存在するかどうかの検証を開始します。存在しない場合は、クエリを終了すると同時にエラーがアプリケーションに報告されます。

4. 次のステップは、オブジェクトの解析ロックを取得することです。これは、データがロックされていない場合に、データの統一性を確保するためです。この時点では挿入されますが、ロックがないため、クエリはすでにこのレコードを読み取っており、一部の挿入はトランザクションの失敗によりロールバックされ、ダーティ リード現象が発生します。

5. 次のステップは、SQL ステートメントの構文とセマンティクスが正しいことを確認することです。この時点で、データベース ユーザーが対応するアクセス許可を持っていない場合は、クエリ結果が取得されない可能性があります。大規模なプロジェクトでは、アプリケーションに複数のデータベース接続文字列が含まれることがよくあります。これらのデータベース ユーザーには、読み取り専用の権限を持つ者、書き込み専用の権限を持つ者、および読み取りと書き込みが可能な者がいます。実行する異なるユーザーを選択します。注意を払わないと、SQL ステートメントがどれほど完璧であっても、完璧であれば意味がありません。

6. 分析の最後のステップは、最終的な実行計画を決定することです。構文、セマンティクス、およびアクセス許可がすべて検証されると、サーバーは結果をすぐに返しません。代わりに、SQL を最適化し、最も効率的な形式でアプリケーションに返すために別のクエリ アルゴリズムを選択します。たとえば、テーブル結合クエリを実行する場合、サーバーはコスト、どのインデックスがより効率的かなどに基づいて最終的にハッシュジョイン、マージジョイン、またはループジョインを使用するかを決定します。ただし、効率的なクエリを作成するための自動最適化には限界があります。 SQL は依然として独自の SQL クエリ ステートメントを最適化する必要があります。

実行プランが決定されると、実行プランは SQL プラン キャッシュに保存され、次回同じ実行リクエストがあった場合は、実行プランの再コンパイルを避けるためにプラン キャッシュから直接フェッチされます。

ステップ 3: ステートメントの実行

サーバーが SQL ステートメントの解析を完了すると、サーバーはステートメントの意味を認識し、実際に SQL ステートメントを実行します。

現時点では 2 つの状況があります:

クエリ ステートメントに含まれるデータ行がデータ バッファー記憶域に読み込まれている場合、サーバーはデータ バッファー記憶域からデータを直接読み取り、アプリケーションに返します。物理ファイルからデータを取得する必要がなくなり、クエリ速度が向上します。

データ行がデータ バッファーにない場合、レコードは物理ファイルから読み取られてアプリケーションに返され、データ行は次回使用するためにデータ バッファーに書き込まれます。

注: SQL キャッシュにはいくつかの種類があります。興味のある方は、キャッシュの存在により、2 回目の実行で最適化の結果をすぐに確認することが難しい場合があります。特に高速であるため、通常は最初にキャッシュが削除され、次に最適化前後のパフォーマンスが比較されます。

DBCCDROPCLEANBUFFERS

バッファ プールからすべてのクリア バッファを削除します。

DBCCFREEPROCCACHE

プロシージャ キャッシュからすべての要素を削除します。

DBCCFREESYSTEMCACHE

すべてのキャッシュから未使用のキャッシュ エントリをすべて解放します。 SQLServer2005 データベース エンジンは、バックグラウンドで未使用のキャッシュ エントリを事前にクリーンアップして、現在のエントリにメモリを使用できるようにします。ただし、このコマンドを使用すると、すべてのキャッシュから未使用のエントリを手動で削除できます。

これは基本的にSQLキャッシュの影響を排除することしかできないようですが、キャッシュを完全に削除する解決策がある場合は、アドバイスをお願いします。

結論: サービス実行アプリケーションによって送信された SQL の操作プロセスを知ることによってのみ、アプリケーションを適切にデバッグすることができます。

SQL 構文が正しいことを確認します。

SQL セマンティクスが正しいこと、つまりオブジェクトが存在するかどうかを確認します。

データベース ユーザーが対応するアクセス権を持っているかどうか。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

SQLステートメントを使用してSQL Serverでテーブルを作成する方法 SQLステートメントを使用してSQL Serverでテーブルを作成する方法 Apr 09, 2025 pm 03:48 PM

SQL ServerでSQLステートメントを使用してテーブルを作成する方法:SQL Server Management Studioを開き、データベースサーバーに接続します。データベースを選択してテーブルを作成します。作成テーブルステートメントを入力して、テーブル名、列名、データ型、制約を指定します。 [実行]ボタンをクリックしてテーブルを作成します。

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

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

SQLステートメントで3つのテーブルを接続する方法に関するチュートリアルを書く方法 SQLステートメントで3つのテーブルを接続する方法に関するチュートリアルを書く方法 Apr 09, 2025 pm 02:03 PM

この記事では、SQLステートメントを使用して3つのテーブルに参加する詳細なチュートリアルを紹介し、読者にさまざまなテーブルのデータを効果的に相関させる方法を学習するよう指導します。例と詳細な構文の説明を使用して、この記事では、SQLのテーブルの参加手法を習得して、データベースから関連情報を効率的に取得できるようにします。

SQLステートメントインサートの使用方法 SQLステートメントインサートの使用方法 Apr 09, 2025 pm 06:15 PM

SQL挿入ステートメントは、テーブルにデータを挿入するために使用されます。手順には以下が含まれます。ターゲットテーブルを指定して、挿入する列をリストします。挿入する値を指定します(値の順序は列名に対応する必要があります)

SQL注射を判断する方法 SQL注射を判断する方法 Apr 09, 2025 pm 04:18 PM

SQLインジェクションを判断する方法には、疑わしい入力の検出、元のSQLステートメントの表示、検出ツールの使用、データベースログの表示、および浸透テストの実行が含まれます。注入が検出された後、脆弱性のパッチを適用し、パッチを確認し、定期的に監視し、開発者の意識を向上させるための措置を講じます。

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

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

PostgreSQLに列を追加する方法は? PostgreSQLに列を追加する方法は? Apr 09, 2025 pm 12:36 PM

postgreSQL列を追加するメソッドは、TableコマンドをAlter Tableコマンドを使用し、次の詳細を検討することです。データタイプ:INTやVarCharなどのデータを保存する新しい列に適したタイプを選択します。デフォルト:nullの値を回避するデフォルトキーワードを介して、新しい列のデフォルト値を指定します。制約:必要に応じて、null、一意、または制約を確認しないでください。並行操作:トランザクションまたはその他の同時制御メカニズムを使用して、列を追加するときにロック競合を処理します。

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

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

See all articles