Давайте начнем с создания оптимального индекса для каждого запроса:
select * from table where field1=value1 and field2=value2;
INDEX(value1, value2) -- in either order
select * from table where field3=value3 and field4=value4;
INDEX(value3, value4) -- in either order
select * from table where field1=value1 and field2=value2 and field3=value3;
INDEX(value1, value2, value3) -- in any order
select * from table where field4=value4;
INDEX(value4)
Теперь давайте посмотрим, сможем ли мы сократить количество индексов:
INDEX(value1, value2) -- in either order, and
INDEX(value1, value2, value3) -- in any order
можно объединитьследующим образом, чтобы иметь один индекс, который хорошо обрабатывает оба выбора:
INDEX(value1, value2, -- in either order
value3) -- afterwards
Аналогично,
INDEX(value3, value4) -- in either order
INDEX(value4)
->
INDEX(value4, value3) -- in THIS order
Итак, для те SELECTs
, два составных индекса являются оптимальными:
INDEX(value1, value2, -- in either order
value3) -- afterwards
INDEX(value4, value3) -- in THIS order
Но ... Вы предоставили все SELECTs
?Я подозреваю, что вы этого не сделали.И вы действительно допускаете все комбинации из нескольких столбцов.Это становится действительно грязным.Вместо того, чтобы выполнять вышеупомянутое упражнение, я рекомендую вам найти наиболее вероятные комбинации, построить несколько составных индексов, а затем сократить их, отметив, что INDEX(a,b,c)
- довольно хорошая замена для INDEX(a,b,d)
.
Но... Становится еще хуже, если у тебя не только =
.При построении составного индекса, но сначала столбец (столбцы) =
, затем любой INs
и, наконец, не более одного теста 'range'.
Но ... Если у вас есть OR
вместо AND
, ну, забудьте об оптимизации.
Полезное правило. Не используйте более 5 индексов.
Теперь, если вы хотите начать все сначала, наберите реальные имена столбцов и реальные типы данных, то есть реальные подсказки того, что имеет смысл, я могу помочь вам в дальнейшем.