2017-12-28 28 views
0

Ich habe eine Abfrage, um Daten von Freunden des Benutzers zu erhalten. Ich habe 3 Tabellen, die eine Benutzertabelle ist, zweite ist eine Benutzer_Tabelle, die Benutzer_ID und FREIND_ID hat (beide sind Fremdschlüssel für Benutzer Tabelle) und 3. Tabelle ist Feed-Tabelle, die User_id und Feed-Inhalt hat. Feed kann Freunden gezeigt werden. Ich kann auf zwei Arten entweder durch Join oder durch Verwendung von In-Klausel abfragen (ich kann alle Freunde IDs von Graph-Datenbank, die ich für die Vernetzung verwende).Mysql innere Join vs in Klausel Leistung

Hier sind zwei Abfragen 1.

SELECT 
    a.* 
from feed a 
inner join user_friend b on a.user_id = b.friend_id 
where b.user_id = 1 ; 
  1. In dieser Abfrage i Freund Ids von Graph-Datenbank erhalten und auf diese Abfrage

    SELECT 
        a.* 
    from feed a 
    where a.user_id in (2,3,4,5) 
    
  2. passieren

Welche Abfrage läuft schneller und gut für die Leistung, wenn ich Millionen von Datensätzen habe?

+0

Mögliches Duplikat von [inner Join und where in() Klausel Leistung?] (Https://stackoverflow.com/questions/5274618/inner-join-and-where-in-clause-performance) – BRjava

+0

Diese Frage hat sub Frage, ich habe tatsächlichen Wert in IN-Klausel. Ich muss keine Tabelle abfragen, um Werte zu erhalten. Aber ich habe durchschnittlich 1000 Werte in IN-Klausel. – Nikesh

+0

Sie sind zwei verschiedene Abfragen. Was ist besser; ein Hammer oder ein Schraubenzieher? – Strawberry

Antwort

0

Dies hängt von Ihrem gewünschten Ergebnis ab, wenn Sie große Daten in Ihrer Unterabfrage vergleichen. Ihre Join-Verbindung ist für solche Bedingungen sehr bevorzugt. Weil Unterabfragen langsamer sein können als LINKS [OUTER] JOINS/INNER JOIN [LEft JOIN ist schneller als INNER JOIN], aber meiner Meinung nach ist ihre Stärke etwas höhere Lesbarkeit.

Also, wenn Ihre Daten weniger Daten zum Vergleichen haben, dann warum Sie eine vollständige Tabelle Join gewählt haben, so dass hängt davon ab, wie viele Daten Sie haben.

Meiner Meinung nach, wenn Sie eine geringere Anzahl von verglichenen Daten in IN als es ist gut, aber wenn Sie eine Unterabfrage oder große Datenmengen haben, dann müssen Sie für eine join ... gehen

+0

Ich habe tatsächlichen Wert in IN-Klausel. Ich muss keine Tabelle abfragen, um Werte zu erhalten. Aber ich habe durchschnittlich 1000 Werte in IN-Klausel. Ich habe keine Unterabfrage. – Nikesh

+0

Wenn diese Anzahl gleich der Anzahl der Datensätze in der Tabelle ist, dann können Sie für die "IN" gehen, ansonsten verwenden Sie "JOIN" –

0

Mit geeignete Indizes, eine One-Query JOIN (Auswahl 1) wird fast immer schneller als ein 2-Abfrage (Choice 2) Algorithmus laufen.

Um die Auswahl 1 zu optimieren, benötigt b diesen zusammengesetzten Index: INDEX(user_id, friend_id). Außerdem benötigt a einen Index (vermutlich PRIMARY KEY?) Beginnend mit user_id.