SQL: "NICHT IN" subquery-Optimierung oder alternativen

Habe ich zwei Datenbank-Tabellen: "Orte" und "übersetzungen". Die übersetzungen von Orten, Namen gemacht durch die Auswahl der Datensätze aus der "Orte", die nicht die übersetzungen für die angegebene Sprache noch:

SELECT `id`, `name`
FROM `places`
WHERE `id` NOT IN (SELECT `place_id` FROM `translations` WHERE `lang` = 'en')

Diese funktionierte mit 7 000 Datensätzen von Orten, stürzte aber, wenn die Anzahl der übersetzungen erreicht 5 000. Seit dann, die Abfrage dauert etwa 10 Sekunden und gibt den Fehler zurück:

2006 - MySQL server has gone away

So wie ich das verstehe, das größte problem hier ist die Unterabfrage zurückgeben zu viele Ergebnisse liefern, bu, wie könnte ich es lösen, wenn ich brauche, um alle zu markieren die Orte, die noch nicht übersetzt?

Mein plan B ist das erstellen eines neuen boolean-Feld in der "Orte" - Tabelle, eine so genannte "übersetzt", und setzen Sie ihn auf "false", jedes mal, wenn ich die Sprache ändern - das würde verhindern, dass für die Unterabfrage. Aber, vielleicht könnte ich ändern Sie einfach meine aktuelle SQL-Anweisung und verhindern, dass zusätzliche Feld?

  • Keine Antwort, mehr ein Vorschlag, wenn es noch immer möglich, bei Ihrem Projekt die Bühne. Wenn ich jenen unaufhörlichen "MySQL Server has gone away" - Fehler auftauchen, die ich portiert, meine app zu Postgresql. Seitdem nie zurück geschaut
InformationsquelleAutor krn | 2010-09-05
Schreibe einen Kommentar