Frage

Ich brauche Beratung in Bezug auf subselect Leistung in MySQL. Aus einem Grund, dass ich nicht ändern kann, bin ich nicht in der Lage zu verwenden JOIN quesry Filter zu erstellen, kann ich nur eine andere AND-Klausel hinzufügen, in WHERE.

Was ist die peformance von:

select tasks.*
from tasks
where 
  some criteria
  and task.project_id not in (select id from project where project.is_template = 1);

im Vergleich zu:

select tasks.*
from tasks, project
where
  some criteria
  and task.project_id = project.id and project.is_template <> 1;

Beachten Sie, dass relativ kleine Anzahl von Projekten ist whete is_template = 1, und es könnte große Anzahl von Projekten, in denen is_template <> 1.

Gibt es andere Art und Weise das gleiche Ergebnis ohne Subselects zu erreichen, wenn ich nichts ändern kann, aber und filtere?

War es hilfreich?

Lösung

Ich glaube, dass die zweite effizienter ist, da es nur eine Auswahl, aber sicher sein erfordert, sollten Sie jede Abfrage EXPLAIN und die Ergebnisse überprüfen.

EXPLAIN select tasks.*
from tasks
where 
  some criteria
  and task.project_id not in (select id from project where project.is_template = 1);

EXPLAIN select tasks.*
from tasks, project
where
  some criteria
  and task.project_id = project.id and project.is_template <> 1;

Andere Tipps

Wie viel Unterschied zwischen den beiden ist, könnte stark davon abhängen, was „einige Kriterien“ ist und welche Möglichkeiten Indizes zu verwenden, die es bietet. Aber beachten Sie, dass sie in Bezug auf die Ergebnisse nicht gleichwertig sind, wenn es Aufgaben gibt, die Projekte nicht haben. Das zweite ist, entspricht dies:

select tasks.*
from tasks
where 
  some criteria
  and task.project_id in (select id from project where project.is_template <> 1);

Ich denke, die erste besser skalieren kann:

Wenn Sie eine Verknüpfung, intern macht mysql eine Art temporärer Tabelle, bestehend aus den beiden Tabellen gemäß den angegebenen Join-Bedingungen verbunden. Sie geben keine Bedingung verbinden, so dass es dann eine temporäre Tabelle mit allen Aufgaben gegen alle aufgeführten Projekte erstellen. Ich bin ziemlich sicher (aber überprüfen Sie mit dem Werkzeug erklären), dass es dies tut vor, wo jeder Klauseln Anwendung.

Ergebnis: Wenn es 10 von jedem sind, werden sie haben 10 * 10 Zeilen = 100. Sie können sehen, wie diese bekommt groß wie Zahlen steigen. Es gilt dann die, wo auf diese temporäre Tabelle.

Im Gegensatz dazu die Unterabfrage wählt nur die entsprechenden Zeilen aus jeder Tabelle.

Aber es sei denn, Skalierung ein Anliegen ist, ich glaube nicht, dass es wirklich wichtig ist.

Vermeiden Sie Unterabfragen wie die Pest in MySQL-Versionen <6.0, und ich bezweifle, Sie verwenden 6.0 es ist immer noch in der Alpha-Phase der Entwicklung berücksichtigen. AFAIK, die MySQL-Optimierer nicht behandelt Subqueries gut aus. Einige wichtige Arbeiten für 6.0 in Modernisierungen des Optimierers gegangen und Unterabfragen arbeiten jetzt viel besser, aber diese Veränderungen nicht rieselte in das 5.0 oder 5.1-Serie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top