MySQL の高度な学習: 結合の 3 つのアルゴリズムを深く理解する
この記事は MySQL の高度な学習であり、結合接続の原理と結合の 3 つのアルゴリズムを詳しく紹介します。
複数のテーブルをクエリするとき、複数のテーブルを結合するために結合を使用することがよくあります。実際、結合の効率は良くないため、使用を避ける必要があります。その本質は次のとおりです。ループ マッチングの場合、MySQL は 1 つの結合アルゴリズム、Nested-Loop Join のみをサポートしますが、アルゴリズムには複数のバリアントがあり、実際に結合の実行効率が向上します。 [関連する推奨事項: mysql ビデオ チュートリアル ]
1. 単純なネストループ結合 (単純なネストループ接続)
Simple Nested Loop join (NLJ) アルゴリズムは、ループ内の最初のテーブルから一度に 1 行を読み取り、データが一貫しているかどうかを照合するネストされたループに各行を渡します。たとえば、駆動テーブル User と駆動テーブル UserInfo の SQL は select * from User u left join User_info info on u.id = info.user_id
です。実際、これはよく使用される for ループです。疑似コードのロジックは、
for(User u:Users){ for(UserInfo info:UserInfos){ if(u.id == info.userId){ // 得到匹配数据 } } }
単純で粗雑なアルゴリズムである必要があり、User テーブルからデータが取得されるたびに、User_info 内のすべてのレコードが一致するかどうかスキャンされ、最後にデータがマージされます。そして戻ってきました。
駆動テーブル User に 10 個のデータがあり、駆動テーブル UserInfo にも 10 個のデータがある場合、駆動テーブル User は実際に 10 回スキャンされ、駆動テーブルは 10 回スキャンされます* 10=100 回 (ドライバー テーブルがスキャンされるたびに、すべての駆動テーブルがスキャンされます) この効率は非常に低く、データベース、特に駆動テーブルのオーバーヘッドが比較的大きくなります。 各スキャンは、実際にはハードディスクからデータを読み取り、メモリにロードします。これが IO です。現在、IO が最大のボトルネックです。
##2. インデックス ネスト ループ結合(インデックス ネスト ループ結合)
インデックス ネスト ループはインデックスを使用してスキャン数を減らし、効率を向上させるため、 -driver テーブルにはインデックスが必要です。 クエリを実行する場合、ドライバー テーブル (ユーザー) は、関連付けられたフィールドのインデックスに基づいてクエリを実行します。インデックスに一致する値が見つかった場合、テーブル クエリが実行されます。非駆動テーブル (User_info) の関連フィールド (user_id) が主キーの場合、クエリ効率は非常に高くなります (主キー インデックス構造のリーフ ノードには完全な行データ (InnoDB) が含まれています)。主キーではないため、インデックスは毎回照合されます。 最後に、テーブル リターン クエリが必要です (セカンダリ インデックス (非主キー インデックス) の主キー ID に基づくテーブル リターン クエリ) が必要となり、パフォーマンスは明らかに低下します。主キークエリよりも。知っておくべき基本的なインデックスの知識と B ツリー インデックスの知識
3. ブロックネストループ結合 (キャッシュブロックネストループ接続)
インデックスがある場合は、インデックスメソッドを使用して結合されます。結合列にインデックスがない場合は、インデックスが使用されます。 , 駆動テーブルを何度もスキャンする必要があります。駆動テーブルにアクセスするたびに、テーブル内のレコードがメモリにロードされ、その後、それに一致するためにドライバ テーブルからレコードが取得されます。が完了すると、メモリがクリアされ、その後、ドライバ テーブルからレコードがロードされ、一致する駆動テーブルのレコードがメモリにロードされます。これが何度も繰り返されるため、IO の数が大幅に増加します。駆動テーブルの IO 数を減らすために、Block Nested-Loop Join メソッドが登場しました。 ドライバー テーブルのデータを 1 つずつ取得するのではなく、少しずつ取得するようになりました。ドライバー テーブルの結合に関連する一部のデータ列をキャッシュするために結合バッファーが導入されました (サイズには制限があります)駆動テーブルの各レコードは、結合バッファ内のすべての駆動テーブル レコードと一度に照合され (メモリ内操作)、複数の比較が行われます。単純なネストされたループ内の 1 つのループが 1 つにマージされ、非駆動テーブルのアクセス頻度が減少します。join_buffer_size=256k です。結合バッファをクエリすると、結合列だけでなく、クエリに参加しているすべての列がキャッシュされます。N 個の結合関連付けを持つ SQL では、N-1 個の結合バッファが割り当てられます。したがって、クエリを実行するときは、より多くの列を結合バッファに格納できるように、不要なフィールドを減らすようにしてください。
show 変数のようなキャッシュ サイズを調整できます。'%join_buffer%'
この値は、実際の状況に応じて変更できます。
ブロック ネストループ結合アルゴリズムを使用するには、オプティマイザー管理構成 block_nested_loop の optimizer_switch 設定をオンにする必要があります。これはデフォルトで有効になっています。 block_nested_loop
ステータスは、show variables like '%optimizer_switch%'
で表示できます。
上記 3 つのアルゴリズムを理解できれば十分ですが、実際の作業ではインデックスをうまく活用できれば問題ありません。接続を結合する場合は、関連付けられたフィールドが確立されているかどうかに注意を払う必要がありますが、クエリの効率性を高めるためには、インデックスを適切に使用する必要があります。
元のアドレス: https://juejin.cn/post/7014105037517357093
著者: Ji 氏
プログラミング関連の知識については、 プログラミング入門をご覧ください! !
以上がMySQL の高度な学習: 結合の 3 つのアルゴリズムを深く理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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