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

SQL Ydeevne UNION vs. OR

Enten brugte den artikel, du læste, et dårligt eksempel, eller også misfortolkede du deres pointe.

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

Dette svarer til:

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

MySQL kan bruge et indeks på company for denne forespørgsel helt fint. Der er ingen grund til at lave UNION.

Det mere vanskelige tilfælde er, hvor du har en OR tilstand, der involverer to forskellige kolonner.

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

Antag, at der er et indeks på company og et separat indeks på city . Da MySQL normalt kun bruger et indeks pr. tabel i en given forespørgsel, hvilket indeks skal den bruge? Hvis den bruger indekset på company , ville den stadig skulle lave en tabelscanning for at finde rækker, hvor city er London. Hvis den bruger indekset på city , ville det skulle lave en tabelscanning for rækker, hvor company er bbc.

UNION løsningen er for denne type sager.

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

Nu kan hver underforespørgsel bruge indekset til sin søgning, og resultaterne af underforespørgslen kombineres af UNION .

En anonym bruger foreslog en redigering af mit svar ovenfor, men en moderator afviste redigeringen. Det skulle have været en kommentar, ikke en redigering. Påstanden om den foreslåede redigering var, at UNION er nødt til at sortere resultatsættet for at eliminere duplikerede rækker. Dette får forespørgslen til at køre langsommere, og indeksoptimeringen er derfor en vask.

Mit svar er, at indekserne hjælper med at reducere resultatsættet til et lille antal rækker, før UNION sker. UNION eliminerer faktisk dubletter, men for at gøre det behøver den kun at sortere det lille resultatsæt. Der kan være tilfælde, hvor WHERE-sætningerne matcher en betydelig del af tabellen, og sortering under UNION er lige så dyrt som blot at udføre tabelscanningen. Men det er mere almindeligt, at resultatsættet reduceres af de indekserede søgninger, så sorteringen er meget billigere end tabelscanningen.

Forskellen afhænger af dataene i tabellen og de termer, der søges efter. Den eneste måde at finde den bedste løsning til en given forespørgsel på er at prøve begge metoder i MySQL-forespørgselsprofileren og sammenligne deres præstationer.



  1. Django-migreringsfejl:Kolonnen eksisterer ikke

  2. Postgresql indsæt trigger for at indstille værdi

  3. Sådan finder du navnet på en begrænsning i SQL Server

  4. MySQL:Giv **alle** privilegier på databasen