2011-01-22 16 views
6

In risposta a this SQL question, ho riscontrato una dichiarazione che l'operatore a valore fisso IN() è molto più lento di INNER JOIN con lo stesso contenuto, al punto che è meglio crea una tabella temporanea per i valori e UNISCI a loro. È vero (in generale, con MySQL, qualsiasi altro motore SQL) e se sì - perché? Intuitivamente, IN dovrebbe essere più veloce - stai confrontando la potenziale corrispondenza con un set fisso di valori, che sono già in memoria e nel formato necessario, mentre con JOIN dovresti consultare gli indici, caricare potenzialmente i dati dal disco e eseguire altre operazioni che potrebbero non essere necessarie con IN. Mi sto perdendo qualcosa di importante?Prestazioni SQL IN() vs. INTERNO performance

Nota che a differenza di this question e di molti duplicati, sto parlando di IN() con set di valori fisso, non di sottoquery.

+0

Questo è sicuramente qualcosa che varia tra piattaforme DB. Nella mia esperienza con SQL Server e PostgreSQL, le clausole 'IN' sulle costanti rispetto agli indici sono molto veloci. – Pointy

+0

La domanda a cui è collegato è SQL Server. Non so se sei già a conoscenza, ma MySQL può essere abbastanza catastrofico con [anche con una query secondaria] (http://stackoverflow.com/questions/3417074/why-would-an-in-condition-be-slower -than-in-sql/3417190 # 3417190) –

+0

@Martin domanda originale (primo collegamento) riguardava MySQL. Conosco i problemi di MySQL con le sottoquery, ma ho pensato che vada bene con le liste costanti, ecco perché la richiesta nella risposta di @ DVK mi ha sorpreso. – StasM

risposta

7

Questo si riferisce alla lunghezza della clausola IN - e ciò che a volte viene chiamato un BUG in MySQL.

MySQL sembra avere una soglia bassa per le clausole IN, quando si scambierà una TABELLA/INDICE SCAN invece di raccogliere più partizioni (una per elemento IN) e unirle.

Con un'INNER JOIN, è quasi sempre costretti ad utilizzare una riga riga per diretta Registrazione collezione, che è per questo che a volte è più veloce

riferimento a queste pagine di manuale di MySQL

potrei sbagliarmi poiché sembra implicare che IN (constant value list) dovrebbe Alwa ys usa una ricerca binaria su ogni elemento ...

+1

Inserire i valori in una tabella temporanea. – Pointy

+0

Qualche idea su quale lunghezza fa andare male? – StasM

+0

@StasM scusate ma non proprio sicuro. Il comportamento può anche essere diverso con le versioni di MySQL. – RichardTheKiwi