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

mysql:Auswahl der effizientesten Abfrage aus den beiden

Es besteht kein Zweifel, dass Version 1 – getrennte where-Klauseln auf jeder Seite der Union – schneller sein wird. Sehen wir uns an, warum Version - where-Klausel über dem Union-Ergebnis - schlechter ist:

  • Datenvolumen:Es wird immer mehr Zeilen im Union-Ergebnis geben, weil es weniger Bedingungen dafür gibt, welche Zeilen zurückgegeben werden. Dies bedeutet mehr Platten-I/O (abhängig von Indizes), mehr temporären Speicher zum Halten des Rowsets, was mehr Verarbeitungszeit bedeutet
  • Wiederholter Scan:Das gesamte Ergebnis der Vereinigung muss erneut gescannt werden, um die Bedingung anzuwenden, wenn es während des ersten Scans hätte behandelt werden können. Dies bedeutet, dass das Rowset doppelt verarbeitet werden muss, obwohl es sich wahrscheinlich im Speicher befindet, aber es ist immer noch zusätzliche Arbeit.
  • Indizes werden nicht für where-Klauseln in einem Union-Ergebnis verwendet. Wenn Sie einen Index über die Fremdschlüsselfelder und haben postType, es würde nicht verwendet werden

Wenn Sie maximale Leistung wünschen, verwenden Sie UNION ALL , der die Zeilen ohne Overhead direkt an das Ergebnis übergibt, anstelle von UNION , das Duplikate entfernt (normalerweise durch Sortieren) und teuer sein kann und Ihren Kommentaren zufolge unnötig ist

Definieren Sie diese Indizes und verwenden Sie Version 1 für maximale Leistung:

create index t1_authorID_postType on t1(authorID, postType);
create index t1_websiteID_postType on t1(websiteID, postType);