Погрешно разбирате как работят индексите.
Помислете за телефонен указател (еквивалент на индекс с две колони на първо име, име и фамилия). Ако ви помоля да намерите всички хора в телефонния указател, чието фамилно име е „Смит“, можете да се възползвате от факта, че имената са подредени по този начин; можете да предположите, че Смитовете са организирани заедно. Но ако ви помоля да намерите всички хора, чието име е "Джон", нямате полза от индекса. Джонс може да има произволно фамилно име и така те са разпръснати из цялата книга и в крайна сметка се налага да търсите по трудния начин, от кора до кора.
Сега, ако ви помоля да намерите всички хора, чието фамилно име е „Смит“ ИЛИ чието име е „Джон“, можете да намерите Смитс лесно както преди, но това изобщо не ви помага да намерите Джон. Те все още са разпръснати из цялата книга и трябва да ги потърсите по трудния начин.
Същото е и с индексите с няколко колони в SQL. Индексът се сортира по първата колона, след това се сортира по втората колона в случаите на връзки в първата колона, след това се сортира по третата колона в случаите на връзки в първите две колони и т.н. Не се сортира по всички колони едновременно. Така че вашият индекс с няколко колони не помага да направите думите ви за търсене по-ефективни, с изключение на най-лявата колона в индекса.
Върнете се към първоначалния си въпрос.
Създайте отделен индекс с една колона за всяка колона. Един от тези индекси ще бъде по-добър избор от другите, въз основа на оценка на колко I/O операции индексът ще възникне, ако се използва.
Съвременните версии на MySQL също имат някои интелигентности относно сливането на индекси , така че заявката може използвайте повече от един индекс в дадена таблица и след това опитайте да обедините резултатите. В противен случай MySQL обикновено е ограничен да използва един индекс на таблица в дадена заявка.
Друг трик, който много хора използват успешно, е да направите отделна заявка за всяка от вашите индексирани колони (която трябва да използва съответния индекс) и след това UNION
резултатите.
SELECT fields FROM table WHERE field1='something'
UNION
SELECT fields FROM table WHERE field2='something'
UNION
SELECT fields FROM table WHERE field3='something'
UNION
SELECT fields FROM table WHERE field4='something'
Едно последно наблюдение:ако откриете, че търсите същото 'something'
в четири полета, трябва да преразгледате дали всичките четири полета всъщност са едно и също нещо и вие сте виновни за проектиране на таблица, която нарушава първата нормална форма с повтарящи се групи
. Ако е така, може би поле1 до поле4 принадлежат към една колона в дъщерна таблица. Тогава става много по-лесно за индексиране и запитване:
SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'