Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Leistung UNION vs. OR

Entweder hat der Artikel, den Sie gelesen haben, ein schlechtes Beispiel verwendet, oder Sie haben den 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 einen Index für company verwenden für diese Abfrage ganz gut. Es ist keine UNION erforderlich.

Der schwierigere Fall ist, wo Sie ein OR haben Bedingung, die zwei verschiedene beinhaltet Spalten.

select username from users where company = 'bbc' or city = 'London';

Angenommen, es gibt einen Index für company und ein separater Index für city . Angesichts der Tatsache, dass MySQL normalerweise nur einen Index pro Tabelle in einer bestimmten Abfrage verwendet, welchen Index sollte es verwenden? Wenn es den Index auf company verwendet , müsste es immer noch einen Tabellenscan durchführen, um Zeilen zu finden, in denen city ist London. Wenn es den Index auf city verwendet , müsste es einen Tabellenscan für Zeilen durchführen, in denen company ist BBC.

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 UNION kombiniert .

Ein anonymer Benutzer hat eine Änderung meiner obigen Antwort vorgeschlagen, aber ein Moderator hat die Änderung abgelehnt. Es hätte ein Kommentar sein sollen, keine Bearbeitung. Der Anspruch der vorgeschlagenen Bearbeitung war, dass UNION die Ergebnismenge sortieren muss, um doppelte Zeilen zu eliminieren. Dadurch läuft die Abfrage langsamer, und die Indexoptimierung ist daher ein Reinfall.

Meine Antwort ist, dass die Indizes dazu beitragen, die Ergebnismenge auf eine kleine Anzahl von Zeilen zu reduzieren, bevor die UNION auftritt. UNION eliminiert zwar Duplikate, muss dazu aber nur die kleine Ergebnismenge sortieren. Es kann Fälle geben, in denen die WHERE-Klauseln mit einem erheblichen Teil der Tabelle übereinstimmen und das Sortieren während UNION so teuer ist wie das einfache Durchführen des Tabellenscans. Aber es ist üblicher, dass die Ergebnismenge durch die indizierten Suchen reduziert wird, sodass das Sortieren viel weniger kostspielig ist als der Tabellen-Scan.

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 in der MySQL-Abfrageprofiler und ihre Leistung vergleichen.