2010-04-26 5 views
6

Vielleicht ist es ein bisschen dumm, aber ich bin mir nur nicht sicher, was besser ist. Wenn ich mehr als 10k Zeilen in db für existanse überprüfen muss, was würde ich tun?Was ist besser - Abfrage mit langer 'where in' Bedingung oder vielen kleinen Abfragen?

# 1 - eine Abfrage

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

# 2 - viele Anfragen

select id from table1 where name=smth1 

Obwohl perfomance nicht das Ziel ist, ich will nicht nach unten gehen mit mysql entweder; ) Vielleicht sind andere Lösungen besser geeignet ... Danke.

upd: Die Aufgabe ist, Domänenliste zu holen, neue zu speichern (die noch nicht in db sind) und diejenigen zu löschen, die aus der Liste verschwunden sind. Hoffe, es hilft ein wenig ...

+1

Sind Sie sicher, dass Sie das nicht anders machen können? –

+0

@ Lo'oris: Ich denke, er meinte, dass er es anders machen könnte, wenn er schrieb: "Vielleicht sind andere Lösungen besser geeignet" –

Antwort

4

Was Sie tun sollten, ist eine temporäre Tabelle erstellen, fügen Sie alle Namen ein, und (mit einer Abfrage) Join gegen diese Tabelle für Ihre Auswahl.

+0

Sie meinen, zuerst tun - Temporäre Tabelle erstellen temptable (Name varchar (255)) ; Dann fügen Sie viele Zeilen ein und verbinden Sie es wie in Ihrem Beispiel? – DCrystal

+1

@DCrystal: Ja, genau. Woher kommt die Namensliste? – RedFilter

+0

Ich habe die Frage aktualisiert, vielleicht wird es klären ... – DCrystal

3

Die einzelne Abfrage wird höchstwahrscheinlich eine bessere Leistung erbringen, da die zweite sehr viele Verzögerungen verursacht. Aber wenn Sie viele Namen haben, wie in Ihrem Beispiel, könnte die erste Methode dazu führen, dass Sie ein internes Limit erreichen.

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

1

Je nachdem, was Sie in Zukunft tun müssen, können Sie eine Funktion in der Datenbank 'strlist_to_table' hinzufügen. Lassen Sie die Funktion einen Text nehmen, bei dem Ihre Eingabe durch ein Trennzeichen begrenzt ist (möglicherweise auch an die Funktion übergeben), teilen Sie sie auf dem Trennzeichen auf, 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 bekommen (vielleicht wenig Bobby Tabellen erscheint im Eingang).

Just my 2 cents ...

0

Ich bin nicht sicher, wie flexibel Ihre Anwendung Design ist, aber es könnte eine permanente dritte Tabelle schaut in das Entfernen der getrennten Liste machen insgesamt und einfach wert sein, die viele zu vertreten -to-many-Beziehung und fügt dann die Tabellen für jede Abfrage hinzu.

Verwandte Themen