Wenn ich die folgenden beiden Tabellen:Beschleunigung wählen, wo Spalte Zustand ohne Duplikate in einer anderen Tabelle existiert
- Tabelle "a" mit 2 Spalten: id (int) [Primary Index], column1 [Indiziert]
- Tabelle "b" mit 3 Spalten: id_table_a (int), condition1 (int), condition2 (int) [alle Spalten als Primärindex]
ich kann die folgende Abfrage ausführen Zeilen aus der Tabelle einer auszuwählen wobei Tabelle b Bedingung1 ist 1
SELECT a.id FROM a WHERE EXISTS (SELECT 1 FROM b WHERE b.id_table_a=a.id && condition1=1 LIMIT 1) ORDER BY a.column1 LIMIT 50
Mit ein paar hundert Millionen Zeilen in beiden Tabellen ist diese Abfrage sehr langsam. Wenn ich das tue:
SELECT a.id FROM a INNER JOIN b ON a.id=b.id_table_a && b.condition1=1 ORDER BY a.column1 LIMIT 50
Es ist so ziemlich sofort, aber wenn es mehr passenden Zeilen in der Tabelle b übereinstimmen id_table_a dann Duplikate zurückgegeben. Wenn ich eine SELECT DISTINCT oder GROUP BY a.id mache, um Duplikate zu entfernen, wird die Abfrage extrem langsam.
Hier zeigt ein SQLFiddle die Beispielabfragen: http://sqlfiddle.com/#!9/35eb9e/10
Gibt es eine Möglichkeit ein, ohne Duplikate schnell in diesem Fall kommen zu machen?
* zeigen Edited dass INNER statt LEFT JOIN nicht viel Unterschied machen hat
* Herausgegeben zeigen Zustand viel Unterschied
* LIMIT hinzufügen Herausgegeben hat noch keinen beizutreten bewegen
* Herausgegeben ORDER BY hinzufügen
Ungefähr wie viele Zeilen werden von der rohen (schnellen) Join-Version zurückgegeben? – Bohemian
Entschuldigung, ich habe jetzt die LIMIT 50 zur Frage hinzugefügt. Es sollte 50 oder was auch immer kleines Limit von den Hunderten von Millionen von Zeilen zurückgeben. – JJJ
Ist die 'Reihenfolge nach 'wirklich erforderlich? Werden 50 tun? – Bohemian