SQL: "NICHT IN" Unterabfrage Optimierung oder Alternativen

8

Ich habe zwei Datenbanktabellen: "Orte" und "Übersetzungen". Die Übersetzungen von Ortsnamen werden gemacht, indem Datensätze von "Orten" ausgewählt werden, die noch keine Übersetzungen in die angegebene Sprache haben:

%Vor%

Dies funktionierte gut mit 7 000 Aufzeichnungen von Plätzen, aber stürzte ab, als die Zahl der Übersetzungen 5 000 erreichte. Seitdem dauert die Abfrage ungefähr 10 Sekunden und gibt den Fehler zurück:

  

2006 - MySQL Server ist weggegangen

Wie ich verstehe, ist das Hauptproblem hier die Unterabfrage, die zu vielen Ergebnissen zurückkehrt. Wie könnte ich es lösen, wenn ich alle Orte auswählen muss, die noch nicht übersetzt sind?

Mein Plan B besteht darin, ein neues boolesches Feld in der "places" -Tabelle mit dem Namen "translated" zu erstellen und jedes Mal, wenn ich die Sprache ändere, auf "false" zurückzusetzen, um Unterabfragen zu verhindern. Aber vielleicht könnte ich meine aktuelle SQL-Anweisung ändern und verhindern, dass ein zusätzliches Feld hinzugefügt wird?

    
krn 05.09.2010, 10:52
quelle

2 Antworten

13

Die offensichtliche Alternative:

%Vor%

Es sollte einen gruppierten zusammengesetzten Index über (translations.id, translations.lang) geben (zusammengesetzt bedeutet: ein einzelner Index über mehrere Felder, gruppiert bedeutet: der Index bestimmt, wie die Tabelle sortiert wird).

    
Tomalak 05.09.2010, 10:57
quelle
0

In diesem Fall glaube ich, dass die beste Alternative darin besteht, zwei getrennte Abfragen durchzuführen. Speichern des Ergebnisses des ersten in einer Variablen und Verwenden des zweiten.

    
Diogo Alves 28.11.2013 20:25
quelle

Tags und Links