2010-04-26 14 views
6

Forse è un po 'stupido, ma non sono sicuro di cosa sia meglio. Se devo controllare più di 10k righe in db per esistenza, cosa farei?Cosa c'è di meglio - query con una condizione lunga 'where in' o molte piccole query?

# 1 - una query

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

# 2 - molte query

select id from table1 where name=smth1 

Anche se, perfomance non è l'obiettivo, non voglio andare giù con mysql sia;) Forse, qualsiasi altra soluzione sarà più adatta ... Grazie.

upd: L'attività è di recuperare l'elenco dei domini, salvare nuovi (che non sono ancora in db) ed eliminare quelli che sono scomparsi dalla lista. Spero, sarà d'aiuto un po '...

+1

sei sicuro di non poterlo fare in altro modo? –

+0

@ Lo'oris: Penso che intendesse farlo in un altro modo quando ha scritto "Forse, qualsiasi altra soluzione sarà più adatta" –

risposta

4

Quello che dovresti fare è creare una tabella temporanea, inserire tutti i nomi e (usando una query) unirsi a questa tabella per la tua selezione.

+0

vuoi dire, prima di tutto - creare una tabella temporanea tentabile (nome varchar (255)) ; quindi inserisci molte righe e unisciti come nell'esempio? – DCrystal

+1

@DCrystal: sì, esattamente. Da dove viene la lista dei nomi? – RedFilter

+0

Ho aggiornato la domanda, forse la chiarirò ... – DCrystal

3

La query singola molto probabilmente funzionerà meglio in quanto il secondo darà molti ritardi di andata e ritorno. Ma se hai molti nomi come nel tuo esempio, il primo metodo potrebbe farti raggiungere un limite interno.

In questo caso, potrebbe essere preferibile memorizzare l'elenco di nomi in una tabella temporanea e unirsi a esso.

1

A seconda del futuro, è necessario aggiungere una funzione nel database "strlist_to_table". Lascia che la funzione prenda un testo in cui il tuo input sia delimitato da un carattere delimitatore (eventualmente passato anche alla funzione), diviso sul delimitatore per creare una tabella al volo. Quindi è possibile utilizzare

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

e anche ottenere la protezione da SQL injection (forse tavolini Bobby appare in ingresso).

Solo i miei 2 cents ...

0

io non sono sicuro di come il vostro disegno flessibile applicazione è, ma forse vale la pena guardare in rimuovendo l'elenco delimitato del tutto e semplicemente facendo un terzo tavolo permanente per rappresentare i tanti -to-molte relazioni, quindi unendo le tabelle su ogni query.

Problemi correlati