Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL Performance UNION vs OR

Albo artykuł, który przeczytałeś, był złym przykładem, albo źle zinterpretowałeś jego punkt widzenia.

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

Odpowiada to:

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

MySQL może używać indeksu w company dla tego zapytania w porządku. Nie ma potrzeby robienia żadnego UNION.

Trudniejszy przypadek jest wtedy, gdy masz OR stan, w którym występują dwa różne kolumny.

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

Załóżmy, że istnieje indeks company i osobny indeks na city . Biorąc pod uwagę, że MySQL zwykle używa tylko jednego indeksu na tabelę w danym zapytaniu, którego indeksu powinien użyć? Jeśli używa indeksu w company , nadal musiałby wykonać skanowanie tabeli, aby znaleźć wiersze, w których city jest Londyn. Jeśli używa indeksu city , musiałby wykonać skanowanie tabeli w poszukiwaniu wierszy, w których company jest bbc.

UNION rozwiązanie jest dla tego typu przypadku.

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

Teraz każde podzapytanie może używać indeksu do wyszukiwania, a wyniki podzapytania są łączone przez UNION .

Anonimowy użytkownik zaproponował zmianę mojej odpowiedzi powyżej, ale moderator odrzucił edycję. Powinien to być komentarz, a nie zmiana. Twierdzenie proponowanej zmiany polegało na tym, że UNION musi posortować zestaw wyników, aby wyeliminować zduplikowane wiersze. Sprawia to, że zapytanie działa wolniej, a optymalizacja indeksu jest zatem myciem.

Moja odpowiedź jest taka, że ​​indeksy pomagają zredukować zestaw wyników do małej liczby wierszy, zanim nastąpi UNION. UNION faktycznie eliminuje duplikaty, ale aby to zrobić, musi tylko posortować mały zestaw wyników. Mogą wystąpić przypadki, w których klauzule WHERE pasują do znacznej części tabeli, a sortowanie podczas UNION jest tak drogie, jak zwykłe skanowanie tabeli. Ale częściej zestaw wyników jest redukowany przez indeksowane wyszukiwania, więc sortowanie jest znacznie mniej kosztowne niż skanowanie tabeli.

Różnica zależy od danych w tabeli i wyszukiwanych terminów. Jedynym sposobem określenia najlepszego rozwiązania dla danego zapytania jest wypróbowanie obu metod w profil zapytań MySQL i porównaj ich wydajność.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć bazę danych w MySQL/MariaDB?

  2. Zapytanie o wybór między serwerami MySQL

  3. Utwórz bazę danych MySQL z Javy

  4. Używanie indeksu, używanie tymczasowe, używanie sortowania plików - jak to naprawić?

  5. MySQL:wybierz losowy wpis, ale waż w stosunku do niektórych wpisów