Оптимальный индекс для , для которого запрос равен
INDEX(col1, col2) -- in either order
. Учитывая это, он обязательно проверит одновременно col1
и col2
, чтобыуменьшите количество строк до гораздо меньшего числа.Следовательно, LIKE
произойдет только для тех немногих строк, которые соответствуют как col1, так и col2. Этот порядок действий, скорее всего, будет оптимальным.
Часто лучше (хотя и не идентично) использовать FULLTEXT(col3)
и иметь
WHERE col1 = 5
AND col2 = 9
AND MATCH(col3) AGAINST ("+string" IN BOOLEAN MODE)
Вв этом случае я почти уверен, что он будет начинаться с индекса FULLTEXT для проверки col3, надеясь получить очень мало строк для двойной проверки по сравнению с другими предложениями.Из-за различных других проблем этот является оптимальным.Любые индексы на col1
и col2
не будут использоваться.
Общее утверждение (на данный момент) таково: Оптимизатор выберет AND
предложение (я), которое он может использовать для одногоINDEX
первый.В этом смысле порядок пунктов AND
нарушается - как оптимизация.
Если у вас нет подходящих индексов, то позор вам.
Есть много возможностей.Я буду рад обсудить отдельные вопросы, но будет сложно сделать слишком много общих слов.