2016-07-09 23 views
0

Bei einer Join-Operation zwischen zwei Unterabfragen (oder einer Tabelle und einer Unterabfrage) wird die LIMIT-Klausel vorzugsweise in einer inneren Abfrage und nicht in der äußeren Abfrage angegeben Bestimmen Sie die Anzahl der Zeilen, die das DBMS durchlaufen müsste, um die where-Klausel zu überprüfen)? wie:Leistung in mysql Joins mit Unterabfrage und Grenzwert

(( SELECT id FROM Table1 WHERE score>=100 LIMIT 10) AS A NATURAL JOIN Table2 ))

wäre besser als

(( SELECT id FROM Table1 WHERE score>=100) AS A NATURAL JOIN Table2 )) LIMIT 10

Mein Denken ist, dass in der letzten Abfrage, die DBMS ersten iterieren müssen (vollständige Tabelle oder einen Index) alle Zeilen in Tabelle 1 Wobei score> = 100, die Tabelle2 in ihren gemeinsamen Spalten (die beliebig viele Zeilen sein können) zugeordnet werden können und erst danach auf nur 10 Zeilen abgeschnitten werden, während sie in der ersten Abfrage nur so lange scannen, bis sie es haben habe 10 Zeilen aus Table1 gefunden, die die where-Klausel erfüllen und Table2, th zugeordnet werden können en stop ....

Antwort

1

Die 2 Teilaussagen sind nicht äquivalent. Bei Verwendung der LIMIT Bestellung ist es wichtig. Wenn Sie das Limit auf Table1 setzen, werden Sie möglicherweise nie die Zeilen sehen, die Sie sonst gesehen hätten, wenn das Limit für das gesamte Dataset gesetzt wäre. Angesichts dieses Haftungsausschlusses scheint es, als würde man das Limit verwenden und dann wäre das Verbinden effizienter, aber die Faustregel ist, dass man immer messen sollte.

Sehen Sie sich auch, dass anstelle der SELECT als Tabelle Beitritt, für die MySQL eine interne temporäre Tabelle zu bauen haben, können Sie die Tabelle anschließen konnte selbst, dh:

SELECT t0.col0, t1.col1 
FROM 
    Table0 t0 
    JOIN Table1 t1 ON (t0.col0 = t1.col0 AND t1.score >= 100) 

, die noch effizienter sein könnte, wenn Sie haben gute Indizes und verwenden sie am Ende. Aber nochmal, du solltest messen.