Mysql
 sql >> Database >  >> RDS >> Mysql

inner join select (A, B) su A e B rispetto a dove (A, B) in select (A, B) in mysql

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.