2017-07-20 5 views
0

Also habe ich gerade eine neue mySQL-Datenbank mit zwei Haupttabellen, BigTable [600.000 Zeilen] und LilTable [8000 Zeilen] begonnen. Es gibt ein Feld blId, das die Tabellen verbindet, die in bigTable indiziert wurden.Extrem langsame verschachtelte mySQL-Abfrage

Ich möchte alle Einträge aus der BigTable, die eine BlId mit einem Eintrag aus der LilTable teilen, die bestimmte Kriterien erfüllt, aber ich brauche keine anderen Informationen aus dieser Tabelle, so scheint eine Verknüpfung übermäßig.

Ohne weitere Umschweife, hier ist mein schrecklich langsam query:

SELECT * FROM testdb.bigTable where blId in 
(SELECT blId FROM certtest.lilTable WHERE color LIKE 'blue'); 

Dieser Vorgang dauert ~ 52 Sekunden auf meinem Computer ausführen kann, und dauerte noch 50 Sekunden, wenn die innere Abfrage 0 Treffer! Im Gegensatz dazu, wenn ich die innere Abfrage separat ausführe und manuell eine Liste von akzeptablen BlIds erstelle, die ich anstelle der Unterabfrage anbringe, läuft sie in weniger als einer Zehntelsekunde. Was in den blauen Flammen geht hier vor?

Edit: Also ich habe eine Möglichkeit gefunden, es zu beschleunigen, wickeln Sie es in eine andere, redundante Select-Anweisung? (Verringert die Abfragezeit auf 0,25 Sekunden.) Jeder könnte dieses Verhalten erklären, es würde sehr geschätzt werden.

SELECT * FROM testdb.bigTable where blId in 
(SELECT * FROM 
    (SELECT blId FROM certtest.lilTable WHERE color LIKE 'blue') AS why 
); 
+0

Müssen Sie 'LIKE' im SQL verwenden? Wäre es schneller, wenn Sie zu 'color = 'blue' wechseln würden? Bitte Tabellenstruktur einfügen. –

+0

Haben Sie in den Tabellen Indizes definiert? Wie groß sind die Tische? Warum wie verwenden? – ChuckCottrill

Antwort

1

Versuchen exists anstelle:

SELECT bt.* 
FROM testdb.bigTable bt 
WHERE EXISTS (SELECT 1 
       FROM certtest.lilTable lt 
       WHERE lt.color LIKE 'blue' AND bt.blID = lt.blId 
      ); 

Für die Zwecke dieser Abfrage Sie auf lilTable(blId, color) einen Index möchten.

+1

Immer noch im Grunde die gleiche Geschwindigkeit. –

+0

@CarlShiles. . . Haben Sie den angegebenen Index? –

+0

Ich mache, aber ich habe es nicht in das Beispiel aufgenommen, weil ein Index ist offensichtlich nicht das Problem, wenn die Verschachtelung des Ausdrucks in einem zusätzlichen Select es 100-fach beschleunigt. Ich suche jemanden, der unter der Haube mySQL-Kenntnisse hat, die dieses Verhalten erklären können. –