MySQL множественные индексы против многостолбцового индекса для поиска - PullRequest
1 голос
/ 20 июля 2011

В программном обеспечении, которое я пишу, есть возможность поиска информации в данной таблице. Форма поиска имеет 5 полей, все из которых, конечно, соответствуют различным столбцам в таблице, но все поля являются необязательными.

Мой вопрос касается того, будет ли работать многоколоночная индексация и как правильно построить запрос для нее.

Если у меня есть один индекс по 5 столбцам, и я строю запрос для их поиска, когда дело доходит до полей в этом индексе, которые я не ищу, я делаю что-то вроде:

field1 = 10 И field2> 0 И ...

Или вообще не включать неиспользуемые столбцы?

Я искал информацию о множественных индексах столбцов, но я не могу найти, что делать, если вам нужно пропустить один из столбцов в данном индексе или если вам просто не нужен этот в этом конкретном случае.

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Вы должны понимать, что в MySQL (в случае InnoDB) он использует только самый левый префикс ваших индексов. Таким образом, если индекс находится в Field1 + Field2, запрос только с Field2 в WHERE не может использовать весь индекс.

И если Field1 + Field2 + Field3 является индексом, то запрос с Field1 & Field3 в ГДЕ будет таким же.

Вариант 1

Вам необходимо создать отдельный индекс для каждого поискового сценария, если вы хотите оптимизировать каждый поиск. Однако, если таблицы большие, индексы также станут очень большими. Если эти поисковые запросы создаются очень часто, это того стоит.

Вариант 2

Вы можете использовать изящный трюк, если ваши поиски имеют низкую селективность (т.е. пол), поместив столбцы низкой селективности в крайнее левое положение и используйте Gender IN(M, F), чтобы включить его в ГДЕ предложение вместе с другими столбцами для использования всего индекса.

1 голос
/ 20 июля 2011

Для запроса с критериями

field1 = 10 AND field2 > 0

вам нужно иметь составной индекс field1 + field2 (в данном конкретном порядке)

0 голосов
/ 20 июля 2011

Это зависит от ваших запросов. Если вы будете часто выполнять много запросов с field1 и field2, то имеет смысл иметь составной индекс. В противном случае вы можете получить штраф по нескольким индексам в одном столбце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...