2010-06-29 12 views
7

Ich kam die Abfrage in differnt Weise über das Schreiben wie unten Typ-I gezeigtdie Abfrage ist besser und effizienter - mysql

SELECT JS.JobseekerID 
     , JS.FirstName 
     , JS.LastName 
     , JS.Currency 
     , JS.AccountRegDate 
     , JS.LastUpdated 
     , JS.NoticePeriod 
     , JS.Availability 
     , C.CountryName 
     , S.SalaryAmount 
     , DD.DisciplineName 
     , DT.DegreeLevel 
    FROM Jobseekers JS 
INNER 
    JOIN Countries C 
     ON JS.CountryID = C.CountryID 
INNER 
    JOIN SalaryBracket S 
     ON JS.MinSalaryID = S.SalaryID 
INNER 
    JOIN DegreeDisciplines DD 
    ON JS.DegreeDisciplineID = DD.DisciplineID 
INNER 
    JOIN DegreeType DT 
    ON JS.DegreeTypeID = DT.DegreeTypeID 
WHERE 
    JS.ShowCV = 'Yes' 

Typ-II

SELECT JS.JobseekerID 
     , JS.FirstName 
     , JS.LastName 
     , JS.Currency 
     , JS.AccountRegDate 
     , JS.LastUpdated 
     , JS.NoticePeriod 
     , JS.Availability 
     , C.CountryName 
     , S.SalaryAmount 
     , DD.DisciplineName 
     , DT.DegreeLevel 
    FROM Jobseekers JS, Countries C, SalaryBracket S, DegreeDisciplines DD 
     , DegreeType DT 
    WHERE 
      JS.CountryID = C.CountryID 
      AND JS.MinSalaryID = S.SalaryID 
      AND JS.DegreeDisciplineID = DD.DisciplineID 
      AND JS.DegreeTypeID = DT.DegreeTypeID 
      AND JS.ShowCV = 'Yes' 

Ich bin mit Mysql-Datenbank

Beide funktioniert wirklich gut, aber ich frage mich

  1. Was ist die beste Praxis, um alle Zeit für jede Situation zu nutzen?
  2. Leistung weise, die besser ist? (Sagen Sie die Datenbank als Millionen Datensätze)
  3. Alle Vorteile von einem über den anderen?
  4. Gibt es ein Tool, wo ich prüfen kann, welche Abfrage besser ist?

Vielen Dank im Voraus

+0

edit: Scorpi0 erwähnt es ganz gut, sollten Sie einen Blick auf seine SO-Links – DrColossos

+0

nop zu nehmen, das DBMS erfassen die innere Verknüpfung, ist es nicht ein Cross Join –

+0

ausführen hmm, ich glaube, ich es irgendwo gelesen in den MySQL-Foren, aber Sie könnten damit recht haben. Vielleicht kann ich den Artikel trotzdem danke dafür finden, darauf hinzuweisen! – DrColossos

Antwort

10

1- Es ist ein Klacks, verwenden Sie den Typen I

2- Der Typ-II-join wird auch als ‚implizite Join‘ genannt, während des Typs I ‚expliziten Join‘ bezeichnet werden. Mit modernen DBMS haben Sie kein Performance-Problem mit der normalen Abfrage. Aber ich denke, mit einer großen komplexen Multi-Join-Abfrage könnte das DBMS Probleme mit dem impliziten Join haben. Wenn Sie nur expliziten Join verwenden, können Sie Ihren Explain-Plan verbessern, also schnelleres Ergebnis!

3- Leistung könnte ein Problem sein, aber am wichtigsten vielleicht ist die Lesbarkeit für weitere Wartung verbessert. Explizite Joins erklären genau, welchem ​​Element Sie bei welchem ​​Feld beitreten möchten, während implizite Joins nicht angezeigt werden, wenn Sie einen Join oder einen Filter erstellen. Die Where-Klausel ist für Filter, nicht für Join!

Und ein großer Punkt für explizite Join: Outer Join sind wirklich nervig mit impliziten Join. Es ist so schwer zu lesen, wenn Sie mehrere Join mit Outer Join möchten, dass explizite Join die Lösung sind.

4- Ausführungsplan sind, was Sie brauchen (See the doc)

Einige Duplikate:

Explicit vs implicit SQL joins

SQL join: where clause vs. on clause

INNER JOIN ON vs WHERE clause

1

in den meisten Code ich gesehen habe, sind diese querys wie Ihr Typ-II getan - aber ich denke, Typ-I wegen der Lesbarkeit besser (und mehr Logik - Join ist ein Join, also sollten Sie es als Join schreiben (obwohl der zweite nur ein anderer Schreibstil für innere Joins ist)).

in der Leistung sollte es keinen Unterschied geben (wenn es einen gibt, denke ich, dass der Typ-I ein bisschen schneller wäre).

1

Mein Vorschlag.

Aktualisieren Sie alle Ihre Tabellen mit einer bestimmten Anzahl von Datensätzen. Greifen Sie auf die MySQL-Konsole zu und führen Sie beide Befehle nacheinander aus. Sie können die Ausführungszeit in der Konsole sehen.

1

Für die beiden Fragen, die Sie erwähnt (jeweils mit nur innere Joins) optimieren die Abfrage jeder modernen Datenbank r sollte genau den gleichen Abfrageplan und damit die gleiche Leistung liefern.

Wenn Sie der MySQL-Abfrage die Präfix EXPLAIN voranstellen, werden Informationen über den Abfrageplan ausgegeben (statt die Abfrage auszuführen). Wenn die Informationen aus beiden Abfragen identisch sind, ist der Abfrageplan derselbe und die Leistung ist identisch. Vom MySQL Reference Manual:

ERKLäREN kehrt eine Reihe von Informationen für jede Tabelle in der SELECT Anweisung verwendet. Die Tabellen sind in die Ausgabe in der Reihenfolge aufgeführt, dass MySQL sie während der Verarbeitung der Abfrage lesen würde. MySQL löst alle Joins unter Verwendung der Join-Methode für verschachtelte Schleifen auf. Dies bedeutet , dass MySQL liest eine Zeile aus der ersten Tabelle, und findet dann eine passende Zeile in der zweiten Tabelle, die dritte Tabelle, und so weiter. Wenn alle Tabellen verarbeitet sind, gibt MySQL die ausgewählten Spalten und Backtracks durch die Tabellenliste aus, bis eine Tabelle für gefunden wird, die mehr übereinstimmende Zeilen enthält. Die nächste Zeile wird aus dieser Tabelle gelesen und der Vorgang wird mit der nächsten Tabelle fortgesetzt.

Wenn das EXTENDED Schlüsselwort verwendet wird, EXPLAIN erzeugt zusätzliche Informationen , die durch die Ausgabe einer Anweisung SHOW WARNINGS die Anweisung EXPLAIN folgenden betrachtet werden kann. Diese Informationen zeigt, wie der Optimierer Tabellen- und Spaltennamen in der SELECT-Anweisung qualifiziert, was die SELECT sieht aus wie nach der Anwendung neu zu schreiben und Optimierungsregeln und möglicherweise andere Notizen über den Optimierungsprozess.

Welche Syntax ist besser? Das liegt bei Ihnen. Wenn Sie jedoch über innere Joins zu Outer Joins hinausgehen, müssen Sie die neuere Syntax verwenden, da es keinen Standard für die Beschreibung von Outer-Joins mit der älteren impliziten Joinsyntax gibt.

Verwandte Themen