6 Stimmen

Was ist besser - Abfrage mit langer 'where in'-Bedingung oder viele kleine Abfragen?

Vielleicht ist es ein bisschen dumm, aber ich bin einfach nicht sicher, was besser ist. Wenn ich mehr als 10k Zeilen in der Datenbank auf Existenz überprüfen muss, was soll ich tun?

1 - eine Abfrage

select id from table1 where name in (smth1,smth2...{bis 30k})

2 - viele Abfragen

select id from table1 where name=smth1

Obwohl die Leistung nicht das Ziel ist, möchte ich auch nicht mit MySQL scheitern ;) Vielleicht sind andere Lösungen besser geeignet... Danke.

aktualisiert: Die Aufgabe besteht darin, eine Liste von Domains abzurufen, neue zu speichern (die noch nicht in der Datenbank sind) und diejenigen zu löschen, die aus der Liste verschwunden sind. Hoffentlich hilft das ein wenig...

4voto

D'Arcy Rittich Punkte 159655

Was Sie tun sollten, ist eine temporäre Tabelle zu erstellen, alle Namen einzufügen und (unter Verwendung einer Abfrage) diese Tabelle für Ihre Auswahl zu verknüpfen.

select id 
from table1 t1
inner join temptable tt on t1.name = tt.name

3voto

Mark Byers Punkte 761508

Die einzelne Abfrage wird höchstwahrscheinlich besser funktionieren, da die zweite eine Menge Hin- und Rückfahrverzögerungen verursachen wird. Aber wenn Sie viele Namen haben, wie in Ihrem Beispiel, könnte die erste Methode dazu führen, dass Sie an ein internes Limit stoßen.

In diesem Fall ist es möglicherweise besser, die Liste der Namen in einer temporären Tabelle zu speichern und mit ihr zu verbinden.

1voto

Joel Punkte 2927

Je nach Ihren zukünftigen Bedürfnissen, ähnliche Dinge zu tun, möchten Sie möglicherweise eine Funktion in der Datenbank 'strlist_to_table' hinzufügen. Lassen Sie die Funktion einen Text nehmen, in dem Ihre Eingabe durch ein Trennzeichen (möglicherweise auch an die Funktion übergeben) begrenzt ist, splitten Sie es beim Trennzeichen, um eine On-the-Fly-Tabelle zu erstellen. Dann können Sie verwenden

where in strlist_to_table('smth1|smth2', '|')

und auch Schutz vor SQL-Injection erhalten (vielleicht erscheint Little Bobby Tables in der Eingabe).

Nur meine 2 Cent...

0voto

Lotus Notes Punkte 6166

Ich bin mir nicht sicher, wie flexibel das Design Ihrer Anwendung ist, aber es könnte sich lohnen, das begrenzte Listenformat vollständig zu entfernen und einfach eine dritte Tabelle zur Darstellung der vielen-zu-vielen Beziehung dauerhaft zu erstellen, um die Tabellen bei jeder Abfrage zu verbinden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X