Или статията, която прочете, е използвала лош пример, или сте изтълкували погрешно тяхната гледна точка.
select username from users where company = 'bbc' or company = 'itv';
Това е еквивалентно на:
select username from users where company IN ('bbc', 'itv');
MySQL може да използва индекс на company
за тази заявка е добре. Няма нужда да правите СЪЮЗ.
По-сложният случай е, когато имате OR
състояние, което включва две различни колони.
select username from users where company = 'bbc' or city = 'London';
Да предположим, че има индекс на company
и отделен индекс за city
. Като се има предвид, че MySQL обикновено използва само един индекс на таблица в дадена заявка, кой индекс трябва да използва? Ако използва индекса на company
, все пак ще трябва да направи сканиране на таблица, за да намери редове, където city
е Лондон. Ако използва индекса на city
, ще трябва да направи сканиране на таблица за редове, където company
е BBC.
UNION
решението е за този тип случаи.
select username from users where company = 'bbc'
union
select username from users where city = 'London';
Сега всяка подзаявка може да използва индекса за своето търсене, а резултатите от подзаявката се комбинират от UNION
.
Анонимен потребител предложи редакция на моя отговор по-горе, но модератор отхвърли редакцията. Трябваше да е коментар, а не редакция. Твърдението на предложената редакция беше, че UNION трябва да сортира набора от резултати, за да елиминира дублиращи се редове. Това прави заявката да се изпълнява по-бавно и следователно оптимизацията на индекса е измиване.
Моят отговор е, че индексите помагат да се намали наборът от резултати до малък брой редове, преди да се случи UNION. UNION всъщност премахва дубликатите, но за да направи това, трябва само да сортира малкия набор от резултати. Може да има случаи, в които клаузите WHERE съвпадат със значителна част от таблицата, а сортирането по време на UNION е толкова скъпо, колкото и простото сканиране на таблицата. Но е по-често наборът от резултати да бъде намален от индексираните търсения, така че сортирането е много по-евтино от сканирането на таблицата.
Разликата зависи от данните в таблицата и термините, които се търсят. Единственият начин да определите най-доброто решение за дадена заявка е да опитате и двата метода в профилизаторът на MySQL заявки и сравнете тяхното представяне.