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

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

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

私はプロの 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 までご連絡ください。
Innodb Redoログの役割を説明し、ログを元に戻します。Innodb Redoログの役割を説明し、ログを元に戻します。Apr 15, 2025 am 12:16 AM

INNODBは、レドログと非論的なものを使用して、データの一貫性と信頼性を確保しています。 1.レドログは、クラッシュの回復とトランザクションの持続性を確保するために、データページの変更を記録します。 2.Undologsは、元のデータ値を記録し、トランザクションロールバックとMVCCをサポートします。

説明出力(タイプ、キー、行、追加)で探す重要なメトリックは何ですか?説明出力(タイプ、キー、行、追加)で探す重要なメトリックは何ですか?Apr 15, 2025 am 12:15 AM

説明コマンドのキーメトリックには、タイプ、キー、行、および追加が含まれます。 1)タイプは、クエリのアクセスタイプを反映しています。値が高いほど、constなどの効率が高くなります。 2)キーは使用されているインデックスを表示し、nullはインデックスがないことを示します。 3)行はスキャンされた行の数を推定し、クエリのパフォーマンスに影響します。 4)追加の情報を最適化する必要があるというFilesortプロンプトを使用するなど、追加情報を提供します。

説明の一時的なステータスを使用し、それを回避する方法は何ですか?説明の一時的なステータスを使用し、それを回避する方法は何ですか?Apr 15, 2025 am 12:14 AM

Temporaryを使用すると、MySQLクエリに一時テーブルを作成する必要があることが示されています。これは、異なる列、またはインデックスされていない列を使用して順番に一般的に見られます。インデックスの発生を回避し、クエリを書き直し、クエリのパフォーマンスを改善できます。具体的には、expliect出力に使用を使用する場合、MySQLがクエリを処理するために一時テーブルを作成する必要があることを意味します。これは通常、次の場合に発生します。1)個別またはグループビーを使用する場合の重複排除またはグループ化。 2)Orderbyに非インデックス列が含まれているときに並べ替えます。 3)複雑なサブクエリを使用するか、操作に参加します。最適化方法には以下が含まれます。1)OrderbyとGroupB

さまざまなSQLトランザクションの分離レベル(読み取り、commited、繰り返し読み取り、シリアル化可能、シリアル化可能)とmysql/innodbの意味を説明してください。さまざまなSQLトランザクションの分離レベル(読み取り、commited、繰り返し読み取り、シリアル化可能、シリアル化可能)とmysql/innodbの意味を説明してください。Apr 15, 2025 am 12:11 AM

MySQL/INNODBは、4つのトランザクション分離レベルをサポートしています。 1.ReadunCommittedは、知らないデータを読み取ることができます。 2。読み込みは汚い読み取りを回避しますが、繰り返しのない読みが発生する可能性があります。 3. RepeatablerEadはデフォルトレベルであり、汚い読み取りと非回復不可能な読みを避けますが、幻の読み取りが発生する可能性があります。 4. Serializableはすべての並行性の問題を回避しますが、同時性を低下させます。適切な分離レベルを選択するには、データの一貫性とパフォーマンス要件のバランスをとる必要があります。

MySQL対その他のデータベース:オプションの比較MySQL対その他のデータベース:オプションの比較Apr 15, 2025 am 12:08 AM

MySQLは、Webアプリケーションやコンテンツ管理システムに適しており、オープンソース、高性能、使いやすさに人気があります。 1)PostgreSQLと比較して、MySQLは簡単なクエリと高い同時読み取り操作でパフォーマンスが向上します。 2)Oracleと比較して、MySQLは、オープンソースと低コストのため、中小企業の間でより一般的です。 3)Microsoft SQL Serverと比較して、MySQLはクロスプラットフォームアプリケーションにより適しています。 4)MongoDBとは異なり、MySQLは構造化されたデータおよびトランザクション処理により適しています。

MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか?MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか?Apr 14, 2025 am 12:18 AM

MySQLインデックスのカーディナリティは、クエリパフォーマンスに大きな影響を及ぼします。1。高いカーディナリティインデックスは、データ範囲をより効果的に狭め、クエリ効率を向上させることができます。 2。低カーディナリティインデックスは、完全なテーブルスキャンにつながり、クエリのパフォーマンスを削減する可能性があります。 3。ジョイントインデックスでは、クエリを最適化するために、高いカーディナリティシーケンスを前に配置する必要があります。

MySQL:新規ユーザー向けのリソースとチュートリアルMySQL:新規ユーザー向けのリソースとチュートリアルApr 14, 2025 am 12:16 AM

MySQL学習パスには、基本的な知識、コアの概念、使用例、最適化手法が含まれます。 1)テーブル、行、列、SQLクエリなどの基本概念を理解します。 2)MySQLの定義、作業原則、および利点を学びます。 3)インデックスやストアドプロシージャなどの基本的なCRUD操作と高度な使用法をマスターします。 4)インデックスの合理的な使用や最適化クエリなど、一般的なエラーのデバッグとパフォーマンス最適化の提案に精通しています。これらの手順を通じて、MySQLの使用と最適化を完全に把握できます。

実際のmysql:例とユースケース実際のmysql:例とユースケースApr 14, 2025 am 12:15 AM

MySQLの実際のアプリケーションには、基本的なデータベース設計と複雑なクエリの最適化が含まれます。 1)基本的な使用法:ユーザー情報の挿入、クエリ、更新、削除など、ユーザーデータの保存と管理に使用されます。 2)高度な使用法:eコマースプラットフォームの注文や在庫管理など、複雑なビジネスロジックを処理します。 3)パフォーマンスの最適化:インデックス、パーティションテーブル、クエリキャッシュを使用して合理的にパフォーマンスを向上させます。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Mac版

SublimeText3 Mac版

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

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。