Heim Datenbank MySQL-Tutorial 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后添加。
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Tipps zur Verwendung von i18n zur Implementierung der Mehrsprachenumschaltung in Vue Tipps zur Verwendung von i18n zur Implementierung der Mehrsprachenumschaltung in Vue Jun 25, 2023 am 09:33 AM

Mit der kontinuierlichen Weiterentwicklung der Internationalisierung müssen immer mehr Websites und Anwendungen mehrsprachige Umschaltfunktionen unterstützen. Als beliebtes Front-End-Framework bietet Vue ein Plug-In namens i18n, das uns bei der Umschaltung mehrerer Sprachen helfen kann. In diesem Artikel werden gängige Techniken zur Verwendung von i18n zur Implementierung der Mehrsprachenumschaltung in Vue vorgestellt. Schritt 1: Installieren Sie das i18n-Plugin. Zuerst müssen wir das i18n-Plugin mit npm oder Yarn installieren. Geben Sie in der Befehlszeile den folgenden Befehl ein: npminst

Was bedeuten Out- und In-Schnittstellen? Was bedeuten Out- und In-Schnittstellen? Sep 28, 2021 pm 04:39 PM

Die Out-Schnittstelle bezieht sich auf die Ausgabeschnittstelle und die In-Schnittstelle bezieht sich auf die Eingabeschnittstelle. Die Out-Schnittstelle stellt im Allgemeinen die Line-Ausgangsschnittstelle der Audioquelle dar, die zum Anschließen von Lasten wie Lautsprechern, Kopfhörern usw. verwendet wird, während die In-Schnittstelle im Allgemeinen die Line-Eingangsschnittstelle der Audioquelle darstellt, die zum Anschluss von CD-Playern und Mobilgeräten verwendet wird Telefone, MP3-Player, Computer usw.

So verwenden Sie die File.Exists-Funktion in C#, um festzustellen, ob eine Datei vorhanden ist So verwenden Sie die File.Exists-Funktion in C#, um festzustellen, ob eine Datei vorhanden ist Nov 18, 2023 am 11:25 AM

So verwenden Sie die Funktion „File.Exists“ in C#, um festzustellen, ob eine Datei vorhanden ist. Bei C#-Dateioperationen ist die Feststellung, ob eine Datei vorhanden ist, eine grundlegende Funktionsanforderung. Die File.Exists-Funktion ist eine Methode in C#, mit der ermittelt wird, ob eine Datei vorhanden ist. In diesem Artikel wird erläutert, wie Sie die Funktion „File.Exists“ in C# verwenden, um festzustellen, ob eine Datei vorhanden ist, und es werden spezifische Codebeispiele bereitgestellt. Referenzieren Sie den Namespace. Bevor Sie mit dem Schreiben von Code beginnen, müssen Sie zunächst auf den System.IO-Namespace verweisen

Was ist der Unterschied zwischen on, in, as und where in MySQL? Was ist der Unterschied zwischen on, in, as und where in MySQL? Jun 03, 2023 am 11:37 AM

Der Unterschied zwischen Mysqlon, in, as, where Antwort: Wo Bedingungen abfragen, on für interne und externe Verbindungen verwenden, as als Alias, in um abzufragen, ob ein bestimmter Wert 2 Tabellen in einer bestimmten Bedingung erstellt: student, scorestudent: score: whereSELECT*FROMstudentWHEREs_sex=' Male'Zum Beispiel: onSELECT*FROMstudentLEFTJOINscoreonstudent.s_id=score.s_id; Kombination aus on und where: SELECT*FROMstudentLEFTJOINs

Fünf Möglichkeiten, den Bluescreen „Thread steckt im Gerätetreiber fest' zu beheben Fünf Möglichkeiten, den Bluescreen „Thread steckt im Gerätetreiber fest' zu beheben Mar 25, 2024 pm 09:40 PM

Einige Benutzer berichteten, dass nach der Installation des März-Win11-Update-Patches KB5035853 von Microsoft ein Bluescreen-of-Death-Fehler auftrat und „ThreadStuckinDeviceDriver“ auf der Systemseite angezeigt wurde. Es wird davon ausgegangen, dass dieser Fehler durch Hardware- oder Treiberprobleme verursacht werden kann. Hier sind fünf Lösungen, die Ihr Computer-Bluescreen-Problem hoffentlich schnell lösen werden. Methode 1: Führen Sie eine Systemdateiprüfung durch. Führen Sie den Befehl [sfc/scannow] in der Eingabeaufforderung aus, mit dem Sie Probleme mit der Systemdateiintegrität erkennen und beheben können. Der Zweck dieses Befehls besteht darin, alle fehlenden oder beschädigten Systemdateien zu scannen und zu reparieren und so zur Gewährleistung der Systemstabilität und des normalen Betriebs beizutragen. Methode 2: 1. Laden Sie das „Blue Screen Repair Tool“ herunter und öffnen Sie es.

Wie führt man eine mehrsprachige Verarbeitung in Vue durch? Wie führt man eine mehrsprachige Verarbeitung in Vue durch? Jun 11, 2023 pm 03:22 PM

In der tatsächlichen Entwicklung ist die mehrsprachige Unterstützung für Websites oder Anwendungen zu einer notwendigen Funktion geworden. Als beliebtes JavaScript-Framework unterstützt Vue auch mehrere Sprachen. In diesem Artikel werden das Schema und die Implementierungsdetails der mehrsprachigen Verarbeitung in Vue vorgestellt. Lösungsauswahl Es gibt viele Lösungen zur Unterstützung mehrerer Sprachen, einschließlich, aber nicht beschränkt auf die folgenden: 1.1 Integrierte Implementierung mehrsprachiger Funktionen im Frontend, unterstützt durch das vue-i18n-Plug-in. Die Einführung des entsprechenden Sprachpakets als eigenständige Komponente kann zu unterschiedlichen Ergebnissen führen

Machen Sie sich mit einigen praktischen Linux-Tipps vertraut Machen Sie sich mit einigen praktischen Linux-Tipps vertraut Mar 12, 2024 pm 01:49 PM

Linux ist ein leistungsstarkes Betriebssystem mit vielen nützlichen Befehlen und Tipps, die Ihnen helfen, es effizienter zu nutzen. 1. Überprüfen Sie den Prüfwert der Datei. Während des Kopier- oder Übertragungsvorgangs kann die Datei beschädigt oder geändert werden. In diesem Fall kann der Prüfwert zur Überprüfung verwendet werden. Normalerweise müssen wir bei unserer Arbeit einige Schnittstellenprogramme verwenden, die von anderen Teams bereitgestellt werden. Wenn die Ausführungsergebnisse dieser Programme nicht den Erwartungen entsprechen, vergleichen wir die MD5-Prüfwerte beider Parteien, um die Konsistenz der Daten zu bestätigen. Es gibt viele Möglichkeiten, den Prüfwert einer Datei zu generieren. Zu den häufig verwendeten gehören die MD5-Summenprüfung, die CRC-Prüfung, die Summenprüfung usw. Die Befehle lauten: md5sumfile_namecksumfile_namesum-Algorithmus-Parameterdatei

Verwendung der EXISTS-Funktion in MYSQL Verwendung der EXISTS-Funktion in MYSQL Feb 24, 2024 pm 05:15 PM

Verwendung von EXISTS in MYSQL, mit Codebeispielen In der MYSQL-Datenbank ist EXISTS ein sehr nützlicher Operator, der verwendet wird, um zu bestimmen, ob eine Unterabfrage mindestens eine Datenzeile zurückgibt. Es wird normalerweise mit einer WHERE-Klausel verwendet, um Daten herauszufiltern, die Bedingungen basierend auf den Ergebnissen einer Unterabfrage erfüllen. Bei der Verwendung von EXISTS müssen Sie die folgenden Punkte beachten: Die EXISTS-Bedingung kümmert sich nicht um die spezifischen Daten, die von der Unterabfrage zurückgegeben werden, sondern nur darum, ob Daten zurückgegeben werden. Die EXISTS-Bedingung kann in Kombination mit anderen Bedingungen verwendet werden.

See all articles