Non è troppo facile rispondere a questa domanda. Dovresti sapere una cosa importante:MySQL tratta IN (<static values list>)
e IN (<subquery>)
come diverse query
. Il primo è uguale a confronto intervallo (come .. OR = .. OR =
) mentre il secondo è uguale a = ANY ()
- e non è la stessa cosa. Quindi, per farla breve:usando IN
con subquery causerà query con ANY()
e MySQL non utilizzerà index per questo anche se la sottoquery è indipendente e restituisce elenco statico di valori . Triste ma vero. MySQL non può prevederlo e quindi index non verrà utilizzato anche se è ovvio. Se utilizzerai JOIN
(ovvero riscrivi il tuo IN (<subquery>)
) - quindi MySQL utilizzerà index per JOIN
condizione, se possibile.
Ora, il secondo caso potrebbe riguardare JOIN
e IN
quando si usano le partizioni. Se utilizzerai JOIN
- poi, purtroppo - ma anche MySQL non è in grado di prevedere le partizioni per JOIN
nel caso comune - e utilizzerà l'intero set di partizioni per questo. Sostituzione di JOIN
a IN (<static list>)
cambierà EXPLAIN PARTITION
immagine:MySQL utilizzerà solo quelle partizioni necessarie per selezionare i valori dall'intervallo, specificati all'interno di IN
clausola. Ma, ancora una volta, questo non funzionerà con IN (<subquery>)
.
In conclusione, è triste quando parliamo di come MySQL sta gestendo IN
subqueries - e in casi comuni non può essere sostituito con JOIN
in modo sicuro (riguarda il partizionamento del caso). Quindi, la soluzione comune sarà:separare la sottoquery dalla query principale a livello di applicazione . Se stiamo parlando di una sottoquery indipendente, che restituisce un elenco di valori statici, questo è il miglior suggerimento:puoi sostituire quell'elenco di valori come IN(<static list>)
e ottieni vantaggi:MySQL utilizzerà index per questo e, se stiamo parlando di partizioni, verranno utilizzate solo quelle effettivamente necessarie.