Ich frage mich, ob es hinsichtlich der Leistung einen Unterschied zwischen den folgenden gibt
SELECT ... FROM ... WHERE someFIELD IN(1,2,3,4)
SELECT ... FROM ... WHERE someFIELD between 0 AND 5
SELECT ... FROM ... WHERE someFIELD = 1 OR someFIELD = 2 OR someFIELD = 3 ...
oder wird MySQL das SQL auf die gleiche Weise optimieren, wie Compiler den Code optimieren?
BEARBEITEN: Die AND
's in OR
' s wurden aus dem in den Kommentaren angegebenen Grund geändert .
mysql
sql
performance
optimization
Scott
quelle
quelle
s I could say that it can also be converted to UNION
ORs konvertiert wird, die zum Ersetzen von ORs zur Optimierung der Abfrage empfohlen wird.Antworten:
Ich musste das sicher wissen, also habe ich beide Methoden verglichen. Ich fand immer
IN
wieder viel schneller als mitOR
.Glauben Sie nicht Menschen, die ihre "Meinung" abgeben. In der Wissenschaft dreht sich alles um Tests und Beweise.
Ich habe eine 1000-fache Schleife der entsprechenden Abfragen ausgeführt (aus Gründen der Konsistenz habe ich verwendet
sql_no_cache
):IN
: 2.34969592094sOR
: 5.83781504631sUpdate:
(Ich habe nicht den Quellcode für den ursprünglichen Test, wie vor 6 Jahren, obwohl er ein Ergebnis im gleichen Bereich wie dieser Test zurückgibt.)
Um einen Beispielcode zum Testen anzufordern, ist hier der einfachste Anwendungsfall. Wenn Sie zur Vereinfachung der Syntax Eloquent verwenden, wird das unformatierte SQL-Äquivalent dasselbe ausgeführt.
quelle
IN
Aussage etwa 30% schneller war als eineOR
.Do not believe people who give their "opinion"
Sie haben 100% Recht, Stack Overflow ist leider voll davonReturns 1 if expr is equal to any of the values in the IN list, else returns 0. If all values are constants, they are evaluated according to the type of expr and sorted. The search for the item then is done using a binary search. This means
IN is very quick if the IN value list consists entirely of constants
. Otherwise, type conversion takes place according to the rules described at Type Conversion, but applied to all the arguments.
IN
Ich habe auch einen Test für zukünftige Googler gemacht. Die Gesamtzahl der zurückgegebenen Ergebnisse beträgt 7264 von 10000
Diese Abfrage dauerte
0.1239
SekundenDiese Abfrage dauerte
0.0433
SekundenIN
ist 3 mal schneller alsOR
quelle
OR
: Verwenden Sie am besten den kompaktesten Ausdruck, der möglich ist.Die akzeptierte Antwort erklärt nicht den Grund.
Nachfolgend finden Sie Zitate aus High Performance MySQL, 3. Ausgabe.
quelle
Ich denke, das ZWISCHEN wird schneller sein, da es umgewandelt werden sollte in:
Nach meinem Verständnis wird ein IN ohnehin in eine Reihe von OR-Anweisungen konvertiert. Der Wert von IN ist die Benutzerfreundlichkeit. (Sie müssen nicht jeden Spaltennamen mehrmals eingeben und können die Verwendung mit vorhandener Logik vereinfachen. Sie müssen sich keine Gedanken über die UND / ODER-Priorität machen, da IN eine Anweisung ist. Mit einer Reihe von ODER-Anweisungen haben Sie um sicherzustellen, dass Sie sie mit Klammern umgeben, um sicherzustellen, dass sie als eine Bedingung bewertet werden.)
Die einzige wirkliche Antwort auf Ihre Frage ist PROFILIEREN SIE IHRE FRAGEN . Dann wissen Sie, was in Ihrer speziellen Situation am besten funktioniert.
quelle
Es hängt davon ab, was Sie tun. Wie groß ist der Bereich, was ist der Datentyp (ich weiß, dass Ihr Beispiel einen numerischen Datentyp verwendet, aber Ihre Frage kann auch für viele verschiedene Datentypen gelten).
Dies ist eine Instanz, in der Sie die Abfrage in beide Richtungen schreiben möchten. Bringen Sie es zum Laufen und verwenden Sie EXPLAIN, um die Ausführungsunterschiede herauszufinden.
Ich bin mir sicher, dass es eine konkrete Antwort darauf gibt, aber so würde ich praktisch die Antwort auf meine gegebene Frage herausfinden.
Dies kann hilfreich sein: http://forge.mysql.com/wiki/Top10SQLPerformanceTips
Grüße,
Frank
quelle
Ich denke, eine Erklärung für die Beobachtung von sunseeker ist, dass MySQL die Werte in der IN-Anweisung tatsächlich sortiert, wenn sie alle statische Werte sind und eine binäre Suche verwenden, die effizienter ist als die einfache ODER-Alternative. Ich kann mich nicht erinnern, wo ich das gelesen habe, aber das Ergebnis von sunseeker scheint ein Beweis zu sein.
quelle
Gerade als Sie dachten, es sei sicher ...
Was ist dein Wert
eq_range_index_dive_limit
? Haben Sie insbesondere mehr oder weniger Artikel in derIN
Klausel?Dies beinhaltet keinen Benchmark, wird aber ein wenig in das Innenleben blicken. Lassen Sie uns ein Tool verwenden, um zu sehen, was los ist - Optimizer Trace.
Die Abfrage:
SELECT * FROM canada WHERE id ...
Mit einem
OR
von 3 Werten sieht ein Teil der Ablaufverfolgung wie folgt aus:...
...
Beachten Sie, wie ICP gegeben wird
ORs
. Dies impliziert, dass diesOR
nicht umgesetztIN
wird und InnoDB eine Reihe von Auftritten ausführen wird=
Tests über ICP durchführen wird. (Ich halte es nicht für sinnvoll, über MyISAM nachzudenken.)(Dies ist Perconas 5.6.22-71.0-Protokoll;
id
ist ein Sekundärindex.)Nun zu IN () mit einigen Werten
eq_range_index_dive_limit
= 10; Es gibt 8 Werte....
...
Beachten Sie, dass das
IN
nicht in verwandelt zu sein scheintOR
.Eine Randnotiz: Beachten Sie, dass die konstanten Werte sortiert wurden . Dies kann auf zwei Arten vorteilhaft sein:
Schließlich IN () mit vielen Werten
...
...
Randnotiz: Ich brauchte dies wegen der Sperrigkeit der Spur:
quelle
ODER wird am langsamsten sein. Ob IN oder ZWISCHEN schneller ist, hängt von Ihren Daten ab, aber ich würde erwarten, dass ZWISCHEN normalerweise schneller ist, da es einfach einen Bereich aus einem Index übernehmen kann (vorausgesetzt, someField ist indiziert).
quelle
Im Folgenden finden Sie Details zu 6 Abfragen mit MySQL 5.6 @SQLFiddle
Zusammenfassend decken die 6 Abfragen unabhängig indizierte Spalten ab und 2 Abfragen wurden pro Datentyp verwendet. Alle Abfragen führten zur Verwendung eines Index, unabhängig davon, ob IN () oder ORs verwendet wurden.
Ich wollte wirklich nur Aussagen entlarven, dass OR bedeutet, dass kein Index verwendet werden kann. Das ist nicht wahr. Indizes können in Abfragen mit OR verwendet werden, da die 6 Abfragen in den folgenden Beispielen angezeigt werden.
Es scheint mir auch, dass viele die Tatsache ignoriert haben, dass IN () eine Syntaxverknüpfung für eine Reihe von ORs ist. Im kleinen Maßstab sind die Leistungsunterschiede zwischen der Verwendung von IN () -v- OR extrem (unendlich) gering.
In größerem Maßstab ist IN () zwar bequemer, entspricht aber logischerweise einer Reihe von ODER-Bedingungen. Die Umstände ändern sich für jede Abfrage, daher ist es immer am besten, Ihre Abfrage in Ihren Tabellen zu testen.
Zusammenfassung der 6 Erklärungspläne, alle "Indexbedingung verwenden" (nach rechts scrollen)
SQL Fiddle
MySQL 5.6 Schema Setup :
.
Abfrage 1 :
Ergebnisse :
Abfrage 2 :
Ergebnisse :
Abfrage 3 :
Ergebnisse :
Abfrage 4 :
Ergebnisse :
Abfrage 5 :
Ergebnisse :
Abfrage 6 :
Ergebnisse :
quelle
Ich wette, sie sind gleich. Sie können einen Test durchführen, indem Sie Folgendes tun:
Durchlaufen Sie das "in (1,2,3,4)" 500 Mal und sehen Sie, wie lange es dauert. Durchlaufen Sie die Version "= 1 oder = 2 oder = 3 ..." 500 Mal und sehen Sie, wie lange sie läuft.
Sie können auch einen Join-Weg versuchen. Wenn someField ein Index ist und Ihre Tabelle groß ist, kann es schneller sein ...
Ich habe die oben beschriebene Join-Methode auf meinem SQL Server ausprobiert und sie entspricht fast der in (1,2,3,4). Beide führen zu einer Suche nach gruppierten Indizes. Ich bin nicht sicher, wie MySQL damit umgehen wird.
quelle
2018 : IN (...) ist schneller. Aber > = && <= ist noch schneller als IN .
Hier ist mein Benchmark .
quelle
Soweit ich weiß, wie der Compiler diese Art von Abfragen optimiert, ist die Verwendung der IN-Klausel effizienter als die Verwendung mehrerer OR-Klauseln. Wenn Sie Werte haben, bei denen die BETWEEN-Klausel verwendet werden kann, ist dies noch effizienter.
quelle
Ich weiß, solange Sie einen Index für Field haben, wird der ZWISCHEN diesen verwenden, um schnell ein Ende zu finden und dann zum anderen zu gelangen. Dies ist am effizientesten.
Jede Erklärung, die ich gesehen habe, zeigt, dass "IN (...)" und "... OR ..." austauschbar und gleichermaßen (in) effizient sind. Was Sie erwarten würden, da der Optimierer nicht wissen kann, ob sie ein Intervall umfassen oder nicht. Dies entspricht auch einer UNION ALL SELECT für die einzelnen Werte.
quelle
Wie von anderen erklärt, ist IN in Bezug auf die Abfrageleistung besser gewählt als OR.
Abfragen mit ODER-Bedingung können in den folgenden Fällen länger dauern.
quelle