Mysql では、in の代わりにexists が使用されます。exists はループを使用して外部テーブルを 1 つずつクエリします。各クエリは、exists の条件文をチェックします。exists の条件文がレコード行を返すことができる場合、条件が true の場合、現在の状態が返され、このレコードにループします。
このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。
exists は、ループを使用して外部テーブルを 1 つずつクエリします。各クエリは、exists の条件ステートメントをチェックします。exists の条件ステートメントは、レコード行を返すことができます (レコード行の数に関係なく、返せる限り)、条件は true の場合、現在のループ内のレコードが返されます。それ以外の場合、exists の条件文がレコード行を返せない場合、現在のループ内のレコードは破棄されます。存在するはブール条件のようなもので、結果セットが返せる場合は true、返せない場合は false
次のように:
select * from user where exists (select 1);
ユーザーの記録サブ条件の select 1 は常にレコード行を返すことができるので、ユーザーテーブルのすべてのレコードが結果セットに追加されるため、select * from user;
と同じになります。そして次のように
select * from user where exists (select * from user where userId = 0);
user テーブルをループするときに、条件ステートメント (select * from user where userId = 0) をチェックすることがわかります。userId が 0 になることはないため、条件ステートメントは常に返されます。空のセットであり、条件は常に false になります。その場合、ユーザー テーブル内のすべてのレコードは破棄されます。
not selected は、exists の反対であり、また、exists 条件が結果セットを返す場合、ループされたレコードは破棄され、それ以外の場合はループされたレコードが結果セットに追加されます。
一般に、テーブル A に n 個のレコードがある場合、存在するクエリは、これらの n 個のレコードを 1 つずつ取り出して、存在する条件を n 回判定する
in query は、複数の or 条件を重ね合わせたものと同等で、次のようなクエリ
select * from user where userId in (1, 2, 3);
と同等です。
select * from user where userId = 1 or userId = 2 or userId = 3;
not in は、次のように in の逆です。
select * from user where userId not in (1, 2, 3);
select * from user where userId != 1 and userId != 2 and userId != 3;
と同等です。一般に、in クエリでは、最初にサブクエリ条件を結合します。結果セットが B で、合計 m 個のレコードがあると仮定します。次に、サブクエリ条件の結果セットが m に分解され、m 個のクエリが実行されます。
クエリ内 サブ条件の返される結果には、
select * from user where userId in (select id from B);
ではなく
select * from user where userId in (select id, age from B);
などのフィールドが 1 つだけ含まれている必要があります。ただし、exists にはこの制限はありません。 exists と in のパフォーマンスを考えてみましょう。
次の SQL ステートメントを考えてみましょう
1: select * from A where names (select * from B where B.id = A.id);
2: select * from A where A.id in (select id from B);
Query 1. 理解しやすいように、次の疑似コードを変換できます。
for ($i = 0; $i < count(A); $i++) { $a = get_record(A, $i); #从A表逐条获取记录 if (B.id = $a[id]) #如果子条件成立 $result[] = $a; } return $result;
Thisおそらくそれが意味することでしょう。実際、クエリ 1 は主にテーブル B のインデックスが使用されていることがわかります。テーブル A がクエリの効率にほとんど影響を与えない方法
テーブルのすべての ID が使用されていると仮定します。 B は 1,2,3, クエリ 2 は
select * from A where A.id = 1 or A.id = 2 or A.id = 3;
これに変換できます わかりやすいです。ここでは主に A のインデックスが使用されます。テーブル B がクエリにほとんど影響を与えない仕組み
not 存在と not in
1 を見てみましょう。
select * from A where not存在 (select * from B where B.id = A.id); #2.
select * from A where A.id not in (select id from B);
クエリ 1 を見ると、B のインデックスを使用している点は上記と同じです
select * from A where A.id != 1 and A.id != 2 and A.id != 3;に変換できます。not in は Range クエリであることがわかります。この != range クエリはインデックスを使用できません。つまり、それぞれのクエリはインデックスを使用できません。レコードがテーブル B に存在するかどうかを確認するには、テーブル A のレコードをテーブル B で 1 回走査する必要があります。したがって、存在しない方が、存在しないよりも効率的です。mysql の in ステートメントは、次の間のハッシュ接続です。外部テーブルと内部テーブルですが、exists ステートメントは外部テーブルのループであり、ループがループするたびに内部テーブルがクエリされます。 in ステートメントよりも存在する方が効率的であると誰もが常に信じてきましたが、このステートメントは実際には不正確です。これは環境によって異なります。
クエリされる 2 つのテーブルが同じサイズの場合、in とexists
2 つのテーブルのうちの 1 つが小さく、もう 1 つが大きいテーブルの場合は、大きいサブクエリ テーブルには存在を使用し、小さいサブクエリ テーブルには in を使用します。
例: テーブル A (小さい) table )、テーブル B (大きなテーブル) 1: select * from A where cc in (select cc from B) は非効率的であり、テーブル A の cc 列のインデックスを使用します。 select * from A where names(select cc from B where cc=A.cc) は効率的で、テーブル B の cc 列のインデックスを使用します。 反対の2:select * from B ここで、cc in (select cc from A)は非常に効率的で、テーブルBのcc列のインデックスを使用します。 select * from B where names(select cc from A where cc=B.cc) は非効率であり、テーブル A の cc 列のインデックスを使用します。 not in および notexisting クエリ ステートメントで not in を使用する場合、インデックスを使用せずに内部テーブルと外部テーブルの両方でテーブル全体がスキャンされ、not extsts のサブクエリは引き続きインデックスを使用できます。テーブル。したがって、どのテーブルが大きくても、notexists を使用した方が not in
よりも高速です。in と = の違い
select name from students where name in ('zhang','wang','li','zhao'); 与select name from students where name='zhang' or name='li' or name='wang' or name='zhao' 結果は同じです。推奨チュートリアル: mysql ビデオ チュートリアル
以上がmysqlでinの代わりに何を使用するかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

MySQLインデックスのカーディナリティは、クエリパフォーマンスに大きな影響を及ぼします。1。高いカーディナリティインデックスは、データ範囲をより効果的に狭め、クエリ効率を向上させることができます。 2。低カーディナリティインデックスは、完全なテーブルスキャンにつながり、クエリのパフォーマンスを削減する可能性があります。 3。ジョイントインデックスでは、クエリを最適化するために、高いカーディナリティシーケンスを前に配置する必要があります。

MySQL学習パスには、基本的な知識、コアの概念、使用例、最適化手法が含まれます。 1)テーブル、行、列、SQLクエリなどの基本概念を理解します。 2)MySQLの定義、作業原則、および利点を学びます。 3)インデックスやストアドプロシージャなどの基本的なCRUD操作と高度な使用法をマスターします。 4)インデックスの合理的な使用や最適化クエリなど、一般的なエラーのデバッグとパフォーマンス最適化の提案に精通しています。これらの手順を通じて、MySQLの使用と最適化を完全に把握できます。

MySQLの実際のアプリケーションには、基本的なデータベース設計と複雑なクエリの最適化が含まれます。 1)基本的な使用法:ユーザー情報の挿入、クエリ、更新、削除など、ユーザーデータの保存と管理に使用されます。 2)高度な使用法:eコマースプラットフォームの注文や在庫管理など、複雑なビジネスロジックを処理します。 3)パフォーマンスの最適化:インデックス、パーティションテーブル、クエリキャッシュを使用して合理的にパフォーマンスを向上させます。

MySQLのSQLコマンドは、DDL、DML、DQL、DCLなどのカテゴリに分割でき、データベースとテーブルの作成、変更、削除、データの挿入、更新、削除、複雑なクエリ操作の実行に使用できます。 1.基本的な使用には、作成可能な作成テーブル、INSERTINTO INSERTデータ、クエリデータの選択が含まれます。 2。高度な使用法には、テーブル結合、サブQueries、およびデータ集約のためのグループに参加します。 3.構文エラー、データ型の不一致、許可の問題などの一般的なエラーは、構文チェック、データ型変換、許可管理を介してデバッグできます。 4.パフォーマンス最適化の提案には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、およびデータの一貫性を確保するためのトランザクションの使用が含まれます。

INNODBは、ロックメカニズムとMVCCを通じて、非論的、一貫性、および分離を通じて原子性を達成し、レッドログを介した持続性を達成します。 1)原子性:Undologを使用して元のデータを記録して、トランザクションをロールバックできることを確認します。 2)一貫性:行レベルのロックとMVCCを介してデータの一貫性を確保します。 3)分離:複数の分離レベルをサポートし、デフォルトでrepeatable -readが使用されます。 4)持続性:Redologを使用して修正を記録し、データが長時間保存されるようにします。

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQLは、中小企業に適しています。 1)中小企業は、顧客情報の保存など、基本的なデータ管理にMySQLを使用できます。 2)大企業はMySQLを使用して、大規模なデータと複雑なビジネスロジックを処理して、クエリのパフォーマンスとトランザクション処理を最適化できます。

INNODBは、次のキーロックメカニズムを通じてファントムの読み取りを効果的に防止します。 1)Next-KeyLockingは、Row LockとGap Lockを組み合わせてレコードとギャップをロックして、新しいレコードが挿入されないようにします。 2)実際のアプリケーションでは、クエリを最適化して分離レベルを調整することにより、ロック競争を削減し、並行性パフォーマンスを改善できます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

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

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