Entweder hat der Artikel, den Sie gelesen haben, ein schlechtes Beispiel verwendet, oder Sie haben ihren Punkt falsch interpretiert.
select username from users where company = 'bbc' or company = 'itv';
Dies entspricht:
select username from users where company IN ('bbc', 'itv');
MySQL kann company
für diese Abfrage einen Index verwenden . Es ist nicht nötig, eine UNION zu machen.
Der schwierigere Fall ist, wenn Sie eine OR
Bedingung haben, die zwei verschiedene Spalten umfasst.
select username from users where company = 'bbc' or city = 'London';
Angenommen, es gibt einen Index company
und einen separaten Index city
. Welchen Index sollte MySQL normalerweise verwenden, da es in einer bestimmten Abfrage normalerweise nur einen Index pro Tabelle verwendet? Wenn der Index aktiviert ist company
, muss immer noch ein Tabellenscan durchgeführt werden, um Zeilen zu finden, in denen city
sich London befindet. Wenn der Index aktiviert ist city
, müsste ein Tabellenscan nach Zeilen durchgeführt werden, in denen company
bbc steht.
Die UNION
Lösung ist für diese Art von Fall.
select username from users where company = 'bbc'
union
select username from users where city = 'London';
Jetzt kann jede Unterabfrage den Index für ihre Suche verwenden, und die Ergebnisse der Unterabfrage werden durch die kombiniert UNION
.
Ein anonymer Benutzer schlug eine Bearbeitung meiner obigen Antwort vor, aber ein Moderator lehnte die Bearbeitung ab. Es sollte ein Kommentar gewesen sein, keine Bearbeitung. Die Behauptung der vorgeschlagenen Bearbeitung lautete, dass UNION die Ergebnismenge sortieren muss, um doppelte Zeilen zu entfernen. Dadurch wird die Abfrage langsamer ausgeführt, und die Indexoptimierung ist daher eine Wäsche.
Meine Antwort ist, dass die Indizes dazu beitragen, die Ergebnismenge auf eine kleine Anzahl von Zeilen zu reduzieren, bevor die UNION stattfindet. UNION eliminiert zwar Duplikate, muss dazu jedoch nur die kleine Ergebnismenge sortieren. Es kann Fälle geben, in denen die WHERE-Klauseln mit einem wesentlichen Teil der Tabelle übereinstimmen und das Sortieren während UNION genauso teuer ist wie das einfache Durchführen des Tabellenscans. Es ist jedoch üblicher, dass die Ergebnismenge durch die indizierten Suchvorgänge reduziert wird, sodass die Sortierung viel kostengünstiger ist als der Tabellenscan.
Der Unterschied hängt von den Daten in der Tabelle und den gesuchten Begriffen ab. Die einzige Möglichkeit, die beste Lösung für eine bestimmte Abfrage zu ermitteln, besteht darin, beide Methoden im MySQL-Abfrageprofiler auszuprobieren und ihre Leistung zu vergleichen.
UNION
dies mehr Arbeit bedeutet, da die Duplikate entfernt werden müssen, wobei der Filter die angegebenen Kriterien abrufen würde. Ich bin überrascht, dass die Verwendung nicht empfohlen wirdIN
.