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ść.