Ohne einen Abfrage-Plan ich nur eine Vermutung machen, wie der Motor möglicherweise Ihre Abfrage ausführen kann, ich hoffe, es hilft:
Erster Schritt - ab:
Wenn Sie einen Index Für die where-Spalten (user_id, user_id) kann eine Indexsuche in Ihrer freunde-Tabelle mit den Bedingungen ausgeführt werden, um die Ergebnisse zu begrenzen, die später im Ausführungsplan ausgewertet werden müssen. Wenn Sie keinen Index haben, kann ein Tabellenscan durchgeführt werden.
Ihre Anfrage würde alle Zeilen aus der Freunde-Tabelle auswählen, wo user_id oder friend_id bis 72.
OR
gleich ist, bedeutet hier, dass nur eine Bedingung erfüllt sein muss, um die Zeile in den Datenstrom von Zeilen hinzugefügt werden von Freunden.
2. Schritt - JOIN:
Nach den Freunden Zeilen gefunden anwenden das Prädikat wo die Verarbeitung tatsächlich kommen würde beginnen. Abhängig von den Tabellenstatistiken und den Abfragekosten kann die Engine einen Join mit Verschachtelungsschleife durchführen, bei dem jede Zeile von Freunden gegen Benutzer ausgewertet wird. Es könnte auch eine Hash-Tabelle für eine Tabelle erstellen und jede Zeile aus der anderen Tabelle mit der Hash-Schlüsselfunktion untersuchen. Auf diese Weise können die IDs zwischen Ihren beiden Tabellen (Freunde und Benutzer) angepasst werden.
Die ON
definiert, welche Spalten zu vergleichen sind.
Betrachten wir den Fall einer Nested-Loop-Verknüpfung, die leichter zu verstehen ist. Dieser Join-Typ durchläuft beide Datenströme (Freunde und Benutzer), die reihenweise miteinander verbunden sind, und wertet jede Zeile aus.
In Ihrer Abfrage wird es die U.id gegen Friend_id vergleichen. Wenn diese Bedingung den Wert true zurückgibt, wird der Join erfüllt und die Engine kombiniert die übereinstimmende Zeile aus den Tabellenfreunden und Benutzern zur weiteren Verarbeitung.Wenn die erste Bedingung von ON falsch oder unbekannt ist, wertet die Engine die zweite Bedingung user_id aus. True erfüllt die Joins, false oder unknown bedeutet, dass die Zeile nicht übereinstimmt, daher wird sie nicht zurückgegeben, da in diesem Fall beide Bedingungen fehlschlagen würden.
3. Schritt - SELECT:
Nachdem die Tabellen der Motor die Daten alle Bedürfnisse hat verbunden sind, es um endlich die die Spalten der Rückkehr SELECT
Anweisung ausführen Sie es gefragt haben.
Es würde sich lohnen, das falsche Tag zu entfernen. Ist das MySQL oder SQL Server? –
Hat MySQL einen ähnlichen Ausführungsplan wie SQL Server? –
Ich habe EXPLAIN-Befehl verwendet, aber es ist nicht das, was ich suche, ich muss die Prinzipien der Arbeit Select-Abfrage verstehen. Wie funktioniert es, oder kompilieren. –