2016-10-25 4 views
1

Ich schreibe eine MySQL-Abfrage und ich habe Zweifel: Welche dieser Codes (unten) sind schneller? Ich denke, wenn ich genauer in "left join" (zweiter Code) bin, sollte es schneller sein. Ist dieser Ansatz richtig?MySQL-Abfrage - bessere Leistung mit mehr Spezifität auf JOIN?

SELECT m.*, p.nome AS nomeprocedimento 
FROM medicos AS m 
    LEFT JOIN medicoprocedimento AS mp ON m.id = mp.medicoid 
    LEFT JOIN procedimentos AS p ON mp.procedimentoid = p.id 
WHERE m.id = 123 

ODER

SELECT m.*, p.nome AS nomeprocedimento 
FROM medicos AS m 
    LEFT JOIN medicoprocedimento AS mp ON m.id = mp.medicoid AND mp.medicoid = 123 
    LEFT JOIN procedimentos AS p ON mp.procedimentoid = p.id 
WHERE m.id = 123 
+0

Bitte geben Sie SHOW CREATE TABLE' ersetzt werden kann, vereinfacht werden. –

+0

Brauchen Sie wirklich 'LINKS'? Erwarten Sie, dass 'p.nome' in einigen Fällen NULL ist? –

Antwort

2

Wenn das Feld indiziert ist, ist es in der Regel macht keinen großen Unterschied machen, da der Abfrageoptimierer werden sehen, dass Sie von der medicoprocedimento.medicoid für einen einzigen Wert freuen (oder medicos.id) Spalte. Also, es wird in der Regel einen Index suchen/scannen auf diesen Wert , bevor es die Verbindung macht, auch wenn Sie nur den Filter in der where Klausel haben und nicht direkt in der join.

Das heißt, Sie sollten immer Ihre Ausführungspläne überprüfen, um sicherzustellen, dass diese Optimierung durchgeführt wird, bevor Sie Ihre Entscheidung treffen. Es gibt keinen Ersatz dafür, zu sehen, was tatsächlich passiert, wenn Sie die Abfrage ausführen.

+0

Ich habe Ihre Überlegungen genossen. Vielen Dank! (Entschuldigung mein armes Englisch) –

0

Sie können EXPLAIN verwenden, um zu wissen, welche schneller ist, aber für Ihr Beispiel sollte das gleiche sein.

+0

Ich versuchte EXPLAIN (Befehl), aber ich bekam die gleiche Antwort. Also, ich habe diese Frage gestellt, um einige Meinungen zu sehen. –

+0

Wenn der EXPLAIN-Befehl das gleiche Ergebnis zeigt, sollte es gleich sein. –

+0

Okay, aber heute habe ich nicht viele Reihen. Ich dachte in einem Szenario mit einer großen Anzahl von Zeilen, wenn es eine andere Leistung haben könnte. –

0

Hinzufügen was Slimns sagen, dass Ihre Abfrage kann mit

SELECT m.*, p.nome AS nomeprocedimento 
FROM medicos AS m 
    INNER JOIN medicoprocedimento AS mp 
      ON m.id = mp.medicoid 
      AND m.id = 123 
    LEFT JOIN procedimentos AS p ON mp.procedimentoid = p.id 

und ich wette, dass die zweite LEFT JOIN auch von INNER JOIN

+0

Diese Abfrage ist nicht gleich der in der Frage. –

+0

@ AntonínLejsek Sind Sie sicher ?. 'LEFT JOIN ON id' mit' WHERE id = something' ist dasselbe wie 'INNER JOIN on id = something' –

+0

Innerer Join würde keine Zeilen zurückgeben, wenn kein medicoprocedimento vorhanden ist. Linke Verbindung würde auch in diesem Fall Medicos zurückgeben. –

Verwandte Themen