2017-05-16 5 views
0

ich InnoDB verwenden mit MySQLLeistungssteigerung mit zwei Abfragen anstelle einer Unterabfrage?

Hey,

ich zwei Tabellen haben: Zuerst nannte man adtells und enthält nur sehr wenige Elemente und selten aktualisiert. Der zweite enthält viele Elemente und erhält regelmäßig neue Einfügungen.

Die zweite Tabelle speichert, welcher Benutzer ein Element aus der ersten Tabelle ausgeblendet hat. Ich denke, ich kann diese Tische nicht betreten.

Meine erste Anfrage war so etwas wie dieses: SELECT xy FROM firstTable 1 WHERE NOT IN (SELECT abc FROM secondTable)

Mein zweiter Ansatz sind zwei Abfragen: Der erste wählt alle benötigten Elemente aus der zweiten Tabelle . Mit diesen Ergebnissen greife ich auf die erste Tabelle zu.

Was sind Ihre Gedanken zu diesen Ansätzen? Ist der erste oder der zweite performanter oder haben Sie noch andere Ideen?


Eine weitere Erläuterung des gegebenen Beispiel: Tabelle 1: id | Inhalt Tabelle 2: userId, tableOneId

Die zweite Tabelle enthält eine Zuordnung von einem bestimmten Benutzer zu einem Element der ersten Tabelle. Wenn es eine Zuweisung gibt, wird die betroffene tableOneId nicht von den obigen Abfragen abgerufen.

Würde mich freuen, von Ihnen zu hören!

+0

Verwendung VORHANDEN NICHT statt in http://stackoverflow.com/questions/915643/select-where-not-exists – maSTAShuFu

+0

Nun, ich in Not, ich will die Elemente entfernen, die sind in der IN-Klausel –

+0

Warum messen Sie nicht einfach? – zerkms

Antwort

1

Verwenden NICHT VORHANDEN

SELECT t1.* FROM firstTable T1 
    WHERE 
    NOT EXISTS 
     (SELECT 1 FROM secondTable T2 where t2.id = t1.id) 

/NICHT VORHANDEN VORHANDEN wird beendet, wenn die erste Übereinstimmung gefunden wird

in allen Zeilen suchen, unabhängig davon, wie viele Spiele .. wenn gibt es 100 Matches dann 100 Iterationen .

Basierend auf Regel-Optimierer:

VORHANDEN ist viel schneller als IN, wenn die Unterabfrageergebnisse sehr groß ist. IN ist schneller als EXISTS, wenn die Ergebnisse der Unterabfrage klein sind. Basierend auf Kostenoptimierer:

Es gibt keinen Unterschied.

Difference between EXISTS and IN in SQL?

+0

Sind Sie sicher, dass dies schneller ist als die beiden Abfragen? Und ich bin mir nicht sicher, ob ich die Abfrage genau verstehe, aber ich möchte trotzdem alle anderen Ergebnisse der ersten Tabelle erhalten, selbst wenn eine von der zweiten Tabelle versteckt ist. –

+0

Sie suchen nur nach einem "no match" an der 2. Tabelle, wollen aber Felder aus der ersten Tabelle anzeigen, oder? – maSTAShuFu

+0

Genau, ich möchte alle Tabellen der ersten Tabelle mit Ausnahme derjenigen anzeigen, die eine zweite Tabelle haben –

Verwandte Themen