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

Performance SQL UNION vs OR

O l'articolo che hai letto ha usato un cattivo esempio o hai interpretato male il loro punto.

select username from users where company = 'bbc' or company = 'itv';

Ciò equivale a:

select username from users where company IN ('bbc', 'itv');

MySQL può utilizzare un indice su company per questa domanda va bene. Non c'è bisogno di fare alcuna UNION.

Il caso più complicato è quello in cui hai un OR condizione che coinvolge due diversi colonne.

select username from users where company = 'bbc' or city = 'London';

Supponiamo che ci sia un indice su company e un indice separato su city . Dato che MySQL di solito utilizza un solo indice per tabella in una determinata query, quale indice dovrebbe usare? Se utilizza l'indice su company , dovrebbe comunque eseguire una scansione della tabella per trovare le righe in cui city è Londra. Se utilizza l'indice su city , dovrebbe eseguire una scansione della tabella per le righe in cui company è bbc.

Il UNION la soluzione è per questo tipo di casi.

select username from users where company = 'bbc' 
union
select username from users where city = 'London';

Ora ogni sottoquery può usare l'indice per la sua ricerca e i risultati della sottoquery sono combinati da UNION .

Un utente anonimo ha proposto una modifica alla mia risposta sopra, ma un moderatore ha rifiutato la modifica. Avrebbe dovuto essere un commento, non una modifica. L'affermazione della modifica proposta era che UNION doveva ordinare il set di risultati per eliminare le righe duplicate. Ciò rende la query più lenta e l'ottimizzazione dell'indice è quindi un lavaggio.

La mia risposta è che gli indici aiutano a ridurre il set di risultati a un numero ridotto di righe prima che avvenga l'UNION. UNION infatti elimina i duplicati, ma per farlo deve solo ordinare il piccolo set di risultati. Potrebbero esserci casi in cui le clausole WHERE corrispondono a una parte significativa della tabella e l'ordinamento durante UNION è costoso quanto semplicemente eseguire la scansione della tabella. Ma è più comune che il set di risultati venga ridotto dalle ricerche indicizzate, quindi l'ordinamento è molto meno costoso della scansione della tabella.

La differenza dipende dai dati nella tabella e dai termini ricercati. L'unico modo per determinare la soluzione migliore per una determinata query è provare entrambi i metodi in il profilatore di query MySQL e confrontare le loro prestazioni.