MySQLの左結合を内部結合に素早く変換するプロセス

MySQLの左結合を内部結合に素早く変換するプロセス

日々の最適化プロセス中に、奇妙なことに気付きました。同じ SQL にまったく異なる 2 つの実行プランがあり、左結合の駆動テーブルさえ異なる可能性があるのです。

左結合の場合、WHERE 条件に関連テーブルによるフィルターが含まれていると、左結合が内部結合に変換されることがあります。この場合、shopInfo にはフィルター条件 ShopCategory = 'LOC' があり、shopInfo のレコードが NULL ではないことが保証されているため、最適化プロセス中に左結合を内部結合に変換できます。 そうすると、O と S の JOIN 順序は交換可能になります。

検証結論:

テーブルを作成します。

--クラステーブル CREATE TABLE T_CLASS(
  class_id int が null ではない、
  クラス名 VARCHAR2(100)
);
インデックスを追加します。alter table T_CLASS add index inx_class_id(class_id);
--学生テーブル CREATE TABLE T_STUDENT(
  学生ID int NULLではない、
  class_id int が null ではない、
  学生名 VARCHAR(100)、
  年齢 int、
  セックス int 
)
インデックスを追加します。alter table T_STUDENT add index index_age(AGE);
--T_CLASS (CLASS_ID、CLASS_NAME) にクラスデータを挿入します
値(1、「クラス1」);

T_CLASS (CLASS_ID、CLASS_NAME) に挿入
値(2、「クラス2」);

T_CLASS (CLASS_ID、CLASS_NAME) に挿入
値(3、「3つのシフト」);

T_CLASS (CLASS_ID、CLASS_NAME) に挿入
値(4、「第4シフト」);

T_CLASS (CLASS_ID、CLASS_NAME) に挿入
値(5、「第5クラス」);
--T_STUDENT に学生データを挿入します (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX)
値(1、1、'李1'、3、'1');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(2、1、'李2'、2、'1');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(3、1、'李3'、3、'1');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(4、2、'李4'、4、'1');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(5、2、'李5'、3、'2');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(6、2、'李6'、3、'1');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(7、3、'李7'、6、'2');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(8、3、'李8'、4、'2');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(9、2、'李9'、2、'2');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(10、2、'李10'、3、'1');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(11、3、'李11'、3、'2');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(12、2、'李12'、8、'2');

T_STUDENT (STUDENT_ID、CLASS_ID、STUDENT_NAME、AGE、SEX) に挿入
値(13、1、'李13'、6、'2');

ケース1: テーブルBにはwhere条件があり、nullではない

ケース2: テーブルAとテーブルBの両方にwhere条件があり、nullではない

ケース3: テーブルAとテーブルBの両方にWHERE条件があり、NULLでない場合は、テーブルBのインデックスを削除します。

結論は:

MySQL オプティマイザーは、関連付けられたテーブルに where 条件があり、そのフィルター条件が関連付けられたテーブルよりも優れている場合にのみ、左結合を内部結合に変換します。

これで、mysql の left join を inner join に素早く変換するプロセスに関するこの記事は終了です。mysql の left join と inner join に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLの結合の基本原理についての簡単な説明
  • SQL文におけるJOINの使用シナリオの分析
  • MYSQL データベースの基礎 - 結合操作の原理
  • MySQL の無効な左結合の問題を解決する方法とその使用上の注意
  • コード標準では、SQL ステートメントに結合が多すぎないようにする必要があるのはなぜですか?
  • MySQL の効率的なクエリの左結合とグループ化 (プラス インデックス)
  • MySQL 結合バッファの原理
  • SQLのさまざまな結合サマリーの詳細な説明

<<:  ユーザーエクスペリエンスの76の経験ポイントの要約

>>:  HTML ウェブページでのアンカー(名前付きアンカー)の使用の概要

推薦する

Vueはタブ切り替えの虫眼鏡効果を実装します

この記事では、タブ切り替えの虫眼鏡効果を実現するためのVueの具体的なコードを例として紹介します。具...

jsはショッピングサイトの虫眼鏡機能を実現します

この記事では、ショッピングサイトの虫眼鏡機能を実現するためのjsの具体的なコードを紹介します。具体的...

myisamchk および mysqlcheck ツールを使用して破損した MySQL データベース ファイルを迅速に修復する方法

サーバーのデータベース ハード ディスク領域がいっぱいだったため、大量のデータの書き込みに失敗し、「...

Docker MySQLコンテナデータベースへの変更が有効にならない問題を解決する

公式の MySQL イメージを使用するには、構成ファイル、DB データ ファイル ディレクトリなどの...

MySQL 8.0.26 のインストールと簡易チュートリアル (インターネット上で最も完全)

目次1. MySQLをダウンロードする1.1 ダウンロード1.2 インストール1. MySQLをダウ...

Vue で Axios 非同期リクエスト API を使用する方法

目次基本的なHTTPリクエストの設定async/await を使用した Axios Axios によ...

Nginx に lua-nginx-module モジュールをインストールする方法

ngx_lua_module は、lua パーサーを nginx に埋め込み、lua 言語で記述され...

MySQL テーブルの追加、削除、変更、クエリの基本チュートリアル

1. 作成する [テーブル名] (フィールド1、フィールド2、...) 値 (値1、値2、...) ...

MySQL ロック(テーブルロック、行ロック、共有ロック、排他ロック、ギャップロック)の詳細な説明

現実世界では、鍵は外の世界から身を隠したいときに使用するツールです。コンピュータでは、複数のプロセス...

JavaScriptプロトタイプとプロトタイプチェーンを徹底的に理解する

目次序文基礎を築くプロトタイプコンストラクタのプロパティ__プロト__プロトタイプチェーン改善する要...

MySQL 5.7.21 解凍バージョンのインストールと設定のグラフィックチュートリアル

この記事では、MySQL 5.7.21の解凍版をダウンロードしてインストールする詳細な手順を記録して...

CSS リセットスタイルリセットの実装例

はじめに: すべてのブラウザには、「ユーザー エージェント スタイル シート」と呼ばれる、すべてのペ...

js における関数のネストとクロージャの詳細

目次1. 範囲2. 関数の戻り値3. 関数のネスト4. 終了5. クロージャの実用的応用1. 内部変...

CentOS 6.5 インストール mysql5.7 チュートリアル

1. 新機能MySQL 5.7 はエキサイティングなマイルストーンです。デフォルトの InnoDB ...

CentOS7.x のアンインストールとインストール MySQL5.7 の操作手順とエンコード形式の変更方法

1. MySQL 5.7 のアンインストール1.1查看yum是否安裝過mysql CD yum li...