MYSQL データベースの基礎 - 結合操作の原理

MYSQL データベースの基礎 - 結合操作の原理

結合では、ネスト ループ結合アルゴリズムが使用されます。ネスト ループ結合には 3 つの種類があります。

t1 から * を選択し、t2 を t1.a = t2.a で結合します。
-- a 100 データ項目、b 1000 データ項目

単純なネストループ結合

テーブル t1 全体が走査されます。T1 は駆動テーブルとして使用されます。t1 の各データは、t2 のテーブル全体で照会されます。このプロセスは 100*1000 回比較されます。

t2 でフル テーブル クエリが実行されるたびに、フル テーブル スキャンがメモリ内で実行されるとは限らず、バッファー プールが削除され、ディスク上に配置される可能性があります。

ブロックネストループ結合(MySQL ドライバーリンクはインデックスを使用しません)

t1 テーブル全体を走査し、t1 データを join_buffer にロードし、次に t2 テーブル全体を走査して、t2 の各データを join_buffer の t1 にキャッシュされたデータと一致させます。

t1 フルテーブルスキャン = 100 回

t2 フルテーブルスキャン = 1000 回

クエリ数 = 1100

join_bufferでの比較 = 100 * 1000回

比較回数は Simple Nested-Loop Join と同じですが、比較処理は Simple Nested-Loop Join よりもはるかに高速で、パフォーマンスも向上します。

join_buffer にはサイズがあります。t1 で見つかったデータが join_buffer のサイズより大きい場合、t1 のデータの一部が最初にロードされます。t2 を比較した後、join_buffer はクリアされ、t1 の残りのデータがロードされます。ロードが不完全な場合は、操作が繰り返されます。

t1 のフル テーブル スキャンの数は join_buffer 1 の数と同じままですが、t2 のスキャンの数はセグメントの数で乗算されます。

駆動テーブルのデータ行数は N であり、アルゴリズム プロセスを完了するにはこれを K セグメントに分割する必要があり、駆動テーブルのデータ行数は M であると仮定します。

K = λ * N

駆動テーブルをスキャンする回数 = M * λ * N

λ は join_buffer のサイズに関係します。join_buffer のサイズが十分に大きい場合、大きなテーブル ドライバーと小さなテーブル ドライバーの時間は同じになります。

セグメンテーションが必要な場合、セグメンテーション回数が少ないほど、駆動テーブルがスキャンされる回数が少なくなるため、小さなテーブル ドライバーを使用する必要があります。

インデックス ネスト ループ結合 (MySQL ドライバー リンクはインデックスを使用します)

フィールド a がインデックス付けされている場合の上記の SQL を例に挙げてみましょう。

t1 テーブル全体がスキャンされ、t1 テーブルの各データが t2 テーブルにインデックスされます。ID が見つかった後、テーブルが再度クエリされます (接続フィールドが t2 テーブルの主キーである場合、テーブル取得操作は省略されます)。

t1はテーブル全体を100回スキャンします

t2 インデックスクエリ = log1000 回

t2 テーブルクエリ = log1000 回

駆動テーブルのデータ行数が N で、駆動テーブルのデータ行数が M であると仮定します。

クエリの総数 = N + N * 2logM

上記からわかるように、駆動テーブル内のデータが大きくなるほどクエリの数も増えるため、駆動テーブルとしては小さなテーブルを使用する必要があります。

この記事は「MySQL実践45講義-講義34」について言及しています。

要約する

MYSQL データベースの結合操作原理の基本に関するこの記事はこれで終わりです。MYSQL 結合原理に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。皆様の今後の 123WORDPRESS.COM へのご支援を心より願っております。

以下もご興味があるかもしれません:
  • 7つのMySQL JOINタイプのまとめ
  • MySQL 結合バッファの原理
  • mysql-joinsの具体的な使用方法
  • MySQL 結合クエリ構文と例
  • MySQL におけるさまざまな一般的な結合テーブルクエリの例の概要
  • MySQLの7つのJOINの具体的な使い方

<<:  HTMLポップアップdivはモバイルの中央揃えを実現するのに非常に便利です

>>:  Linux ドライバ開発でよく使われる関数 copy_from_user open read write の詳細な説明

推薦する

HTML で水平ナビゲーション構造を設定する方法

この記事では、主にリスト構造を使用して水平ナビゲーション構造を設定する 2 つの方法を紹介します。こ...

Ubuntu 19でdockerソースをインストールできない問題を共有する

主要な Web サイトと個人的な習慣に従って、Docker ソースを追加するには次の方法を使用します...

HTML の基本 - ハイパーリンク スタイルを設定する簡単な例

*** ハイパーリンクのスタイル設定の例a:link クリックされる前のハイパーリンクの状態a:vi...

HTML ページ適応幅テーブル

WEB アプリケーションのページでは、テーブルがよく使用されます。列の数が限られているため、各列のコ...

CSS はスクロールバーを非表示にしてコンテンツをスクロールする効果を実現します (3 つの方法)

フロントエンド開発では、スクロールバーを非表示にしながらスクロールをサポートしなければならないという...

CSS3で実装されたテキストポップアップ効果

成果を達成する実装コードhtml <div>123WORDPRESS.COM</d...

フレックスレイアウトは左のテキストオーバーフローを実現し、右のテキストの適応を省略します

テキストの長さに応じて、左側のテキストの幅を自動調整できる状況を実現したい。1行が表示できない場合、...

MySQL データベースの文字化け問題の原因と解決策

序文データベースのデータを表示すると、文字化けした文字が表示されることがあります。実際、どのようなデ...

Dockerデータストレージの概要

この記事を読む前に、ボリューム、バインドマウント、tmpfs マウントの基本を理解しておいてください...

Linux システムでログを手動でスクロールする方法

ログローテーションは、Linux システムでは非常に一般的な機能です。ログローテーションは、システム...

Windows はリモート デスクトップが長時間自動的に切断されるのを防ぎます

Windows リモート デスクトップを使用してサーバーに接続したことがある人なら、リモート デスク...

MySQL学習データベース検索文DQL小百章

目次1. データの簡単な取得2. データの並べ替えと取得2.1. 基本構文2.2. ソート方向を指定...

vue-video-player でのブレークポイント再開の実装

最近のプロジェクトでは、ブレークポイントからビデオの再生を再開する機能を実装する必要がありました。こ...

美しいチェックボックススタイル(複数選択ボックス)はIE8/9/10、FFなどと完全に互換性があります。

恥ずかしながら、このようなよく使われるチェックボックスのスタイルを変更するために、Baidu で長い...

MySQL データをエクスポートおよびインポートするための HeidiSQL ツール

場合によっては、SQL へのデータのエクスポートとインポートを容易にするために、特定のツールを使用し...