1. 事前に準備する便宜上、ここで 2 つのテーブルを作成し、そこにいくつかのデータを追加します。 果物用のテーブル、サプライヤー用のテーブル。 フルーツテーブル フルーツテーブル 識別子 | 名前 | 価格 |
---|
1 1 | りんご | 5 | 2 番 | アプリコット | 2 | 1 1 1 | ブラックベリー | 10 | b2 | ベリー | 8 | 1 1 | カウント | 9 |
サプライヤーテーブル サプライヤーテーブル s_id | s_name |
---|
101 | 虹 | 102 | ウォルマート | 103 | カルフール | 104 | 中国資源先駆者 |
デモンストレーションにはこれら 2 つのテーブルを使用します。 2. 存在するものexists キーワードに続くパラメータは任意のサブクエリです。システムはサブクエリを操作して、行を返すかどうかを判断します。少なくとも 1 行が返された場合、 exists の結果はtrue となり、外部クエリ ステートメントが照会されます。サブクエリが行を返さない場合、 exists の結果はfalse となり、外部ステートメントは照会されません。
サブクエリがSELECT NULL の場合でも、MYSQL はそれをTrue 見なすことに注意してください。 

3. 何がサブクエリに in キーワードを使用すると、内部クエリ ステートメントは 1 つのデータ列のみを返し、このデータ列の値は比較演算のために外部クエリ ステートメントに提供されます。 in キーワードをテストするために、 fruit テーブルに s_id 列を追加しました。 フルーツテーブル フルーツテーブル 識別子 | 名前 | 価格 | s_id |
---|
1 1 | りんご | 5 | 101 | 2 番 | アプリコット | 2 | 103 | 1 1 1 | ブラックベリー | 10 | 102 | b2 | ベリー | 8 | 104 | 1 1 | カウント | 9 | 103 |
| | 
4. 存在し、
in と exists の違いは何ですか? どのような場合に in を使用し、どのような場合に exists を使用すればよいですか?
まずは公式を覚えて、その後で詳細について話しましょう! 「外部クエリ テーブルがサブクエリ テーブルより小さい場合は、exists を使用します。外部クエリ テーブルがサブクエリ テーブルより大きい場合は、in を使用します。外部テーブルとサブクエリ テーブルが類似している場合は、どちらか好きな方を使用します。 」
すでにお分かりかと思いますが、fruits テーブルのデータが非常に大きい場合、最大で 1 回だけ fruit テーブルのすべてのデータを走査するため、 での使用は適していません。
たとえば、suppliers テーブルに 10,000 件のレコードがあり、fruits テーブルに 1,000,000 件のレコードがある場合、実行可能なトラバーサルの最大回数は 10,000*1,000,000 回となり、非常に非効率的です。
たとえば、suppliers テーブルに 10,000 件のレコードがあり、fruits テーブルに 100 件のレコードがある場合、最大可能なトラバーサルは 10,000*100 回となり、トラバーサルの回数が大幅に削減され、効率が大幅に向上します。
ただし、suppliers テーブルには 10,000 件のレコードがあり、fruits テーブルには 100 件のレコードがある場合、exists() は依然として 10,000 回実行されます。in() はメモリ内をトラバースし、exists() はデータベースをクエリする必要があるため、10,000*100 回トラバースするには in() を使用する方が適切です。データベースをクエリするとパフォーマンスが高くなり、メモリの方が高速になることは周知の事実です。
したがって、覚えておかなければならないのは、「外部クエリ テーブルがサブクエリ テーブルより小さい場合は exists を使用し、外部クエリ テーブルがサブクエリ テーブルより大きい場合は in を使用し、外部テーブルとサブクエリ テーブルが類似している場合は、どちらか好きな方を使用する」という式だけです。
5. 存在しないし、存在しない

exists と同様に、suppliers の id インデックスが使用され、exists() は fruit.length 回数実行され、exists() の結果セットはキャッシュされません。

not in は本質的に!= and != ···
と等しく、 != はインデックスを使用しないため、not in はインデックスを使用しません。
なぜインデックスを使用しないのですか?
データが 100 万個あり、s_id には 0 と 1 の 2 つの値しかないと仮定します。インデックスを使用するには、まずインデックス ファイルを読み取り、バイナリ検索を実行して対応するデータ ディスク ポインターを見つけ、読み取りポインターに基づいてディスク上の対応するデータを使用する必要があります。これは、500,000 の結果セットに影響します。この場合、直接のフル テーブル スキャンよりも速いのは明らかです。
s_id フィールドが一意の場合は、インデックスが使用されます。
インデックスを使用する必要がある場合は、force index を使用できますが、効率は向上せず、一般的に速度が低下します。
インデックスを適切に使用してください。カーディナリティは重要な指標です。カーディナリティが小さすぎると、インデックスがまったくないのと同じになり、スペースも無駄になります。
したがって、サプライヤーや果物の規模に関係なく、存在しないものを使用する方が効率的です。
MySQL の in と exists の違いについての詳細説明はこれで終わりです。MySQL の in と exists の違いについての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。
以下もご興味があるかもしれません:- MySQL における EXISTS と IN の使用法の比較
- MySQL における exists、in、any の基本的な使い方
- MySQL における in と exists の使い方と違いの紹介
- MySQL ステートメントにおける IN と Exists の比較分析
- MySQLの存在と詳細な説明と違い
- MySQL の in クエリと exists クエリの違いの概要
- MYSQL IN と EXISTS の最適化の例
- mysql は、含まれていない、左結合、IS NULL、NOT EXISTS の効率の問題のレコードです
---|