2010-07-29 5 views
5

Mögliche Duplizieren:
Is there a performance difference between BETWEEN and IN with MySQL or in SQL in general?SQL: BETWEEN und IN (die schneller ist)

Wenn ich die folgenden ids:

1,2,3,4, 5,6

Ist es besser zu nutzen oder die zwischen Klausel zum Löschen?

+0

Ich würde denken, dass die Leistung für Abfragen oder Löschen die gleiche ist. – FrustratedWithFormsDesigner

+2

Ehrlich gesagt kann diese Art von Frage nicht beantwortet werden * es kommt darauf an *. 'zwischen' scheint genau hier zu sein, aber ist es schneller? Wird es immer schneller sein? Es ist beträchtlich, im Zusammenhang mit dem Löschen von Daten? Welche DBMS hast du, Indizes usw. Nur du kannst das beantworten, indem du nachprüfst. – Kobi

+0

Entschuldigung MSSQL 2005 – RPS

Antwort

9
  • Wenn Ihre ids immer aufeinander folgende sind, sollten Sie BETWEEN verwenden.
  • Wenn Ihre IDs möglicherweise nicht fortlaufend sind, dann verwenden Sie IN.

Leistung sollte nicht wirklich der entscheidende Faktor hier sein. Allerdings scheint BETWEEN in allen von mir getesteten Beispielen schneller zu sein. Zum Beispiel:

Ohne Indizes eine Tabelle mit einer Million Zeilen überprüft, wo jede Zeile hat x = 1:

 
SELECT COUNT(*) FROM table1 WHERE x IN (1, 2, 3, 4, 5, 6); 
Time taken: 0.55s 

SELECT COUNT(*) FROM table1 WHERE x BETWEEN 1 AND 6; 
Time taken: 0.54s 

Ohne Indizes eine Tabelle mit einer Million Zeilen überprüft, wobei x eindeutige Werte hat:

 
SELECT COUNT(*) FROM table1 WHERE x IN (1, 2, 3, 4, 5, 6); 
Time taken: 0.65s 

SELECT COUNT(*) FROM table1 WHERE x BETWEEN 1 AND 6; 
Time taken: 0.36s 

Ein realistischeres Beispiel dafür ist aber, dass die id Spalte eindeutig und indiziert ist. Wenn Sie dies tun, wird die Leistung beider Abfragen fast augenblicklich.

 
SELECT COUNT(*) FROM table2 WHERE x IN (1, 2, 3, 4, 5, 6); 
Time taken: 0.00s 

SELECT COUNT(*) FROM table2 WHERE x BETWEEN 1 AND 6; 
Time taken: 0.00s 

Also würde ich sagen, konzentrieren sich auf das Schreiben einer klaren SQL-Anweisung, anstatt sich über geringfügige Unterschiede in der Ausführungsgeschwindigkeit zu sorgen. Und stellen Sie sicher, dass die Tabelle korrekt indexiert ist, da dies den größten Unterschied macht.

Hinweis: Die Tests wurden auf SQL Server Express 2008 R2 ausgeführt. Die Ergebnisse können auf anderen Systemen abweichen.

+0

Ich habe Überraschungen, mit einem von "in"/"zwischen" mit den Indizes, und nicht mit dem anderen. In beiden Richtungen. Eine Abfrage wird plötzlich falsch ausgeführt (abhängig von den tatsächlichen Werten), da sie als "full scan" anstatt der * logischen * index scan verarbeitet wird ... – pascal

+0

In den meisten Fällen stimme ich Mark zu, aber beachte, dass die Leistung a ist Beachten Sie, dass Sie Ihre Indizes berücksichtigen und beide Optionen benchmarken sollten. Ich hatte Fälle in MySQL, wo die Verwendung von 'IN' viel schneller war als die Verwendung von' BETWEEN'. –

4

IN entsprechen 1 or 2 or 3 or 4 or 5

Zwischen zu >= 1 and <= 6

persönlich gleichwertig ist, würde ich zwischen in Bereichen verwenden, aber spezifische Gegebenheiten und DB-Motoren können auch einen Unterschied machen.

+2

+1, ** Ich benutze nie zwischen **, enthält es Endpunkte? jeder scheint zu vergessen, also benutze ich '>' '' '' '' '' '' '' zusammen mit '<=' oder '<' und es ist kristallklar, ob Endpunkte enthalten sind oder nicht. –

+0

@KM, es schließt Endpunkte ein, zwischen einschließlich und imho, falsch benannt. – CaffGeek

+0

@Chad, danke ;-) aber ich sagte 'jeder scheint zu vergessen', nicht dass ich es vergessen hätte. "Zwischen" bedeutet für mich auf Englisch die Gegenstände im Inneren. Wenn ich also sage, dass du alles zwischen meinen Händen haben kannst, meine ich nicht meine Hände! Indem man den Code schreibt, um die tatsächlichen '> ='/'>' und '<='/'<' einzuschließen, wird klar, was genau du vorhast, was zu einem leichteren Verständnis des Codes führt. –

2

Hängt davon ab, ob Indizes umgesetzt werden. Wenn die ID der Primärschlüssel ist, sollten beide Abfragen die gleichen Kosten haben. Werten Sie die SQL mit einem Profiler aus.

1

Zwischen Klausel, es sei denn, Sie die IDs erwarten in Zukunft anders zu sein.

0

Zwischen schnellen aufgrund geringerer Vergleiche. Mit IN-Klausel werden jedes Element jedes Mal durchlaufen.

Aber Zweck beide sind unterschiedlich:

  • Zwischen verwendet, wenn Sie mit Wertebereich in einer Art Sequenz vergleichen.

  • IN wird beim Vergleich mit Werten verwendet, die nicht in der Sequenz liegen.