ホームページ データベース mysql チュートリアル IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结

IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结

Jun 07, 2016 pm 06:00 PM
exists in

下面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法。

1. EXISTS的执行流程
select * from t1 where exists ( select null from t2 where y = x )
可以理解为:
代码如下:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop

对于in 和 exists的性能区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了
另外IN时不对NULL进行处理,如:
select 1 from dual where null in (0,1,2,null)
结果为空。

2. NOT IN 与NOT EXISTS:
NOT EXISTS的执行流程
代码如下:
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);

可以理解为:
代码如下:
for x in ( select * from rollup )
loop
if ( not exists ( that query ) ) then
OUTPUT
end if;
end;

注意:NOT EXISTS 与 NOT IN 不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。
例如下面语句,看他们的区别:
select x,y from t;
x y
------ ------
1 3
3 1
1 2
1 1
3 1
5
select * from t where x not in (select y from t t2 )
no rows
select * from t where not exists (select null from t t2
where t2.y=t.x )
x y
------ ------
5 NULL
所以要具体需求来决定
对于not in 和 not exists的性能区别:
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join.
如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null
NOT IN 在基于成本的应用中较好
比如:
代码如下:
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);

改成(佳)
select ......
from title T, rollup R
where R.source_id = T.Title_id(+)
and T.Title_id is null;
或者(佳)
sql> select /*+ HASH_AJ */ ...
from rollup R
where ource_id NOT IN ( select ource_id
from title T
where ource_id IS NOT NULL )
注意:上面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法。
'//=============================
exists,not exists总结

1 exists
SELECT * FROM anken_m WHERE EXISTS(
SELECT my_list_temp_m.sales_code
FROM my_list_temp_m
WHERE my_list_temp_m.sales_code=anken_m.sales_code)
说明:
1) 查询在anken_m表和my_list_temp_m表中都存在的sales_code。
2) sales_code是anken_m的主键,my_list_temp_m的外键。
注意:
1) 外层查询表anken_m是查询的对象。
2) 内层查询表my_list_temp_m是条件对象。
3) 内外层的查询表不能相同。
4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。
5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。

2 not exists
SELECT * FROM anken_m WHERE NOT EXISTS(
SELECT my_list_temp_m.sales_code
FROM my_list_temp_m
WHERE my_list_temp_m.sales_code=anken_m.sales_code)
说明:
1) 查询在anken_m表中存在,但是在my_list_temp_m表中不存在的sales_code。
2) sales_code是anken_m的主键,my_list_temp_m的外键。
注意:
1) 外层查询表anken_m是查询的对象。
2) 内层查询表my_list_temp_m是条件对象。
3) 内外层的查询表不能相同。
4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。
5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。

3 综合运用
UPDATE anken_m
SET(plan_type_code, branch_name, business_type_code)
=(SELECT anken.plan_type_code,anken.branch_name,anken.business_type_code
FROM anken
WHERE anken.sales_code=anken_m.sales_code)
WHERE EXISTS (
SELECT anken.sales_code
FROM anken,my_list_temp_m
WHERE my_list_temp_m.sales_code=anken.sales_code
AND anken.sales_code=anken_m.sales_code
)
说明:
1) 用一个表的记录数据更新另一个表的记录数据。
2) 用一个SQL语句进行批量更新。
2) sales_code是anken,anken_m的主键,my_list_temp_m的外键。
注意:
1) set 语句中的要被更新字段必须跟数据源字段一一对应,另外数据源查询中的条件必须限定一条记录。也就是根据sales_code可以唯一确定anken的一条记录,和anken_m的一条记录,这样才能保证要被更新的记录和数据源记录的主键是相同的。
2) 根据WHERE EXISTS语句可以确定数据源记录的范围,也就是可以用anken表中哪些记录更新anken_m表。所以anken_m不需要在WHERE EXISTS语句中的FROM后添加。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

i18n を使用して Vue で多言語切り替えを実装するためのヒント i18n を使用して Vue で多言語切り替えを実装するためのヒント Jun 25, 2023 am 09:33 AM

国際化の継続的な発展に伴い、多言語切り替え機能をサポートする必要がある Web サイトやアプリケーションがますます増えています。人気のあるフロントエンド フレームワークとして、Vue は多言語切り替えの実現に役立つ i18n と呼ばれるプラグインを提供します。この記事では、i18n を使用して Vue で多言語切り替えを実装するための一般的なテクニックを紹介します。ステップ 1: i18n プラグインをインストールする まず、npm または Yarn を使用して i18n プラグインをインストールする必要があります。コマンドラインに次のコマンドを入力します: npminst

アウトインターフェイスとインインターフェイスは何を意味しますか? アウトインターフェイスとインインターフェイスは何を意味しますか? Sep 28, 2021 pm 04:39 PM

out インターフェイスは出力インターフェイスを指し、in インターフェイスは入力インターフェイスを指します。出力インターフェイスは通常、スピーカー、ヘッドフォンなどの負荷の接続に使用されるオーディオ ソース ライン出力インターフェイスを表し、一方、入力インターフェイスは通常、CD プレーヤー、モバイル機器の接続に使用されるオーディオ ソース ライン入力インターフェイスを表します。電話、MP3 プレーヤー、コンピュータなど。

C# で File.Exists 関数を使用してファイルが存在するかどうかを確認する方法 C# で File.Exists 関数を使用してファイルが存在するかどうかを確認する方法 Nov 18, 2023 am 11:25 AM

C# で File.Exists 関数を使用してファイルが存在するかどうかを確認する方法 C# のファイル操作では、ファイルが存在するかどうかを確認することが基本的な機能要件です。 File.Exists 関数は、ファイルが存在するかどうかを確認するために使用される C# のメソッドです。この記事では、C# で File.Exists 関数を使用してファイルが存在するかどうかを確認する方法を紹介し、具体的なコード例を示します。名前空間を参照する コードの記述を開始する前に、まず System.IO 名前空間を参照する必要があります。

Mysql の on、in、as、where の違いは何ですか? Mysql の on、in、as、where の違いは何ですか? Jun 03, 2023 am 11:37 AM

Mysqlon、in、as、where の違い 答え: Where クエリ条件は、内部接続と外部接続に on をエイリアスとして使用し、特定の値が特定の条件で 2 つのテーブルを作成するかどうかをクエリするために in を使用します:student、scorestudent:score: whereSELECT*FROMstudentWHEREs_sex=' Male'例: onSELECT*FROMstudentLEFTJOINscoreonstudent.s_id=score.s_id; on と where の組み合わせ: SELECT*FROMstudentLEFTJOINs

デバイスドライバーのブルースクリーンでスレッドスタックを修正する5つの方法 デバイスドライバーのブルースクリーンでスレッドスタックを修正する5つの方法 Mar 25, 2024 pm 09:40 PM

一部のユーザーは、Microsoft の 3 月の Win11 アップデート パッチ KB5035853 をインストールした後、ブルー スクリーン オブ デス エラーが発生し、システム ページに「ThreadStuckinDeviceDriver」が表示されたと報告しました。このエラーはハードウェアまたはドライバーの問題によって発生する可能性があることが理解されています。ここでは、コンピューターのブルー スクリーンの問題をすぐに解決できる 5 つの修正方法を紹介します。方法 1: システム ファイル チェックを実行する コマンド プロンプトで [sfc/scannow] コマンドを実行すると、システム ファイルの整合性の問題を検出して修復できます。このコマンドの目的は、欠落または破損したシステム ファイルをスキャンして修復し、システムの安定性と通常の動作を確保することです。方法 2: 1. 「ブルー スクリーン修復ツール」をダウンロードして開きます。

Linux の実用的なヒントをいくつか確認してください Linux の実用的なヒントをいくつか確認してください Mar 12, 2024 pm 01:49 PM

Linux は、Linux をより効率的に使用するための便利なコマンドやヒントが数多く備わった強力なオペレーティング システムです。 1. ファイルチェック値を確認します ファイルのコピーまたは送信プロセス中に、ファイルが破損または変更されている可能性があります。この場合、チェック値を検証に使用できます。通常、私たちの作業では他のチームが提供するインターフェイス プログラムを使用する必要があります。これらのプログラムの実行結果が期待どおりにならない場合は、双方の md5 チェック値を比較してデータの一貫性を確認します。ファイルのチェック値を生成するにはさまざまな方法がありますが、一般的に使用される方法には、md5sum チェック、crc チェック、sum チェックなどが含まれます。コマンドは次のとおりです: md5sumfile_namecksumfile_namesum アルゴリズム パラメータ ファイル

Vue で多言語処理を行うにはどうすればよいですか? Vue で多言語処理を行うにはどうすればよいですか? Jun 11, 2023 pm 03:22 PM

実際の開発においては、Webサイトやアプリケーションの多言語対応が必須の機能となっています。人気の JavaScript フレームワークとして、Vue は複数の言語もサポートしています。この記事では、Vueにおける多言語処理の仕組みと実装内容を紹介します。ソリューションの選択 以下を含むがこれらに限定されない、多くの多言語サポート ソリューションがあります: 1.1. vue-i18n プラグインを通じてサポートされる、フロントエンドでの多言語機能のフロントエンド統合実装。対応する言語パックを独立したコンポーネントとして導入すると、異なる表示が可能になります

MYSQL での EXISTS 関数の使用 MYSQL での EXISTS 関数の使用 Feb 24, 2024 pm 05:15 PM

MYSQL での EXISTS の使用法 (コード例付き) MYSQL データベースでは、EXISTS は非常に便利な演算子であり、サブクエリが少なくとも 1 行のデータを返すかどうかを判断するために使用されます。通常、サブクエリの結果に基づいて条件を満たすデータをフィルタリングするために WHERE 句とともに使用されます。 EXISTS を使用する場合は、次の点に注意する必要があります。 EXISTS 条件では、サブクエリによって返される特定のデータは考慮されず、返されるデータがあるかどうかのみが考慮されます。 EXISTS 条件は、他の条件と組み合わせて使用​​できます。

See all articles