この記事は、mysql に関する関連知識を提供します。主に、左結合、右結合、内部結合、およびハッシュ結合の動作原理を紹介し、サブクエリと結合の違いを分析します。学んだことを踏まえて、仕事で身につけるべきスキルを一緒に見ていきましょう。
# 推奨学習:
mysql ビデオ チュートリアル
1. MySQL データベースの JOIN 接続
複数のテーブルにインデックスを作成したり、複数のテーブルの JOIN ステートメントやサブクエリ ステートメントを作成したりするのは比較的困難です。多くの開発者は、JOIN が SQL のパフォーマンス効率を低下させると無意識に信じているため、開発者は JOIN 実装プロセスを理解していないため、これが SQL 実行の効率に影響を与えると考え、複数テーブルの SQL を単一テーブルのクエリに分割します。
テーブル R と S が接続されていると仮定すると、結合間のテーブルの関連付けでは、照合にインデックスを使用します。
テーブル R は駆動テーブルと呼ばれ、テーブル R の WHERE 条件でフィルタリングされたデータは、テーブル S に対応するインデックスに対して 1 つずつクエリされます。テーブル R を駆動するデータの量が大きくない場合、上記のアルゴリズムは非常に効果的です。
次の 3 つの JOIN タイプの場合、どのテーブルが駆動テーブルであるか:
SELECT * FROM R LEFT JOIN S ON R.x = S.x WEHRE ...
SELECT * FROM R RIGHT JOIN S ON R.x = S.x WEHRE ...
SELECT * FROM R INNER JOIN S ON R.x = S.x WEHRE ...
ログイン後にコピー
1、内部結合
INNER JOIN の場合、駆動テーブルはテーブル R またはテーブル S になります。左側と右側で共有するデータを表示します。
このシナリオでは、より少量のデータをクエリする必要がある人がテーブルを操作します。次の例を見てみましょう
SELECT * FROM R INNER JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
ログイン後にコピー
2, LEFT JOIN
上記の左結合の場合、駆動テーブルは左側のテーブル R です。 Right Join の場合、ドライバー テーブルは右テーブル S です。これは、左側のテーブルと右側のテーブルのどちらのデータをクエリする必要があるかを決定する JOIN タイプです。
左側のテーブルのすべてのレコードと、右側のテーブルの等しい結合フィールドを持つレコードを返します。右のテーブルに一致する行がない場合でも、左のテーブルのすべての行を返します。
SELECT * FROM R LEFT JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
ログイン後にコピー
3. 右結合
上記の左結合の場合、駆動テーブルは左テーブル R であり、右結合では、運転テーブルは右テーブルテーブルSです。これは、左側のテーブルと右側のテーブルのどちらのデータをクエリする必要があるかを決定する JOIN タイプです。
右側のテーブルのすべてのレコードと、左側のテーブルの結合フィールドに等しいレコードを返します。左側のテーブルに一致するものがない場合でも、右側のテーブルのすべての行を返します。
SELECT * FROM R RIGHT JOIN S ON R.x = S.x WHERE R.y = ? AND S.z = ?
ログイン後にコピー
2. MySQL データベースのハッシュ結合
1. ハッシュ結合とは
MySQL 2 番目の JOIN はハッシュ JOIN で、2 つのテーブル間の結合条件にインデックスがない場合に使用されます。
接続がない場合、インデックスを作成しても問題ありませんか?
一部の列が選択性の低いインデックスである場合、データをインポートするインデックスを作成するときにデータを並べ替える必要があり、インポートのパフォーマンスに影響し、セカンダリ インデックスでテーブルを返すときに問題が発生します。フィルタリングされたデータの量が多い場合は、直接の全テーブル スキャンの方が高速になります。
OLAP ビジネス クエリの場合 (OLAP は
オンライン分析処理、はデータ分析に使用されます。これにより、複数のデータベース システムからの情報を同時に分析できます) 、は、ギリシャ人のつながりは重要な機能です。 MySQL 8.0 はハッシュ結合アルゴリズムのサポートを開始し、OLAP ビジネスのサポートを強化します。
したがって、クエリするデータの量がそれほど大きくなく、クエリの応答時間が分レベルである必要がある場合は、MySQL 8.0 の単一インスタンスを使用して、次のクエリを完了できます。ビッグデータ。
2. ハッシュ JOIN の仕組み
ハッシュ JOIN は、MySQL 8.0 の実行プランに表示されます。ハッシュ JOIN は、関連付けられた 2 つのテーブルをスキャンします。 、ドライブ テーブルのスキャン中にハッシュ テーブルが作成され、2 番目のテーブルがスキャンされると、関連付けられたレコードごとにハッシュ テーブルが検索されます。見つかった場合は、レコードが返されます。
ハッシュ結合選択ドライバー テーブルとネストされたループ結合アルゴリズムは、どちらも基本的に同じです。どちらの小さいテーブルもドライバー テーブルとして使用されます。ドライバー テーブルが大きく、作成されたハッシュ テーブルがメモリ サイズを超える場合、MySQL は結果を自動的にディスクにダンプします。
3. サブクエリ
私を含め、かなりの数の開発学生が、従来の JOIN ステートメントの代わりにサブクエリを作成することを好むことがわかりました。
サブクエリのロジックは非常に明確です。 JOIN もニーズを満たすことができますが、LEFT JOIN は代数的な関係であり、サブクエリは人間の思考の観点から理解する傾向があるため、理解するのは簡単ではありません。
ただし、MySQL 8.0 では、オプティマイザが in サブクエリを JOIN 実行プランに自動的に最適化するため、パフォーマンスが大幅に向上します。
SQL の実行計画にのみ注目する必要があり、2 つの実行計画が同じであれば、パフォーマンスに違いはありません。
MySQL 8.0 より前では、MySQL はサブクエリを完全には最適化しませんでした。したがって、サブクエリの実行計画にプロンプト DEPENDENT SUBQUERY が表示されます。これは、それが依存サブクエリであり、サブクエリが外部テーブルの関連付けに依存する必要があることを示しています。 DEPENDENT SUBQUERY は実行が非常に遅くなる可能性があり、ほとんどの場合、これを 2 つのテーブル間の結合に手動で変換する必要があります。
それではブロガーの紹介ですヒント皆さん、現在の MySQL 8.0 バージョンでサブクエリを作成できる場合は、サブクエリの最適化が完全に完了しているためです。
MySQL 8.0 バージョンより前の場合MySQL の場合、すべてのサブクエリの SQL 実行プランを表示する必要があります。 DEPENDENT SUBQUERY のヒントは最適化する必要があります。最適化しないと、ビジネスに重大なパフォーマンス影響を及ぼします。DEPENDENT SUBQUERY の最適化は、通常、テーブル結合の派生テーブルとして書き換えられます。
推奨学習: mysql ビデオ チュートリアル
以上がMySQL の原則の概要: 左結合、右結合、内部結合、およびハッシュ結合の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。