Проверяются ли несколько предложений WHERE / AND в MySQL последовательно?И пропускаются ли последующие проверки, если первая ложна? - PullRequest
0 голосов
/ 23 ноября 2018

Сценарий

Допустим, у меня есть запрос MySQL, который содержит несколько предложений WHERE / AND.

Например, скажем, у меня есть запрос

SELECT * FROM some_table
WHERE col1 = 5
AND col2 = 9
AND col3 LIKE '%string%'

Вопрос

Выполнена ли здесь проверка col1 = 5 как первая в последовательности, так как она написана первой?И что более важно, пропускаются ли две другие проверки, если col1 != 5?

Причина, по которой я спрашиваю, состоит в том, что третье предложение, col3 LIKE '%string3%, займет больше времени для выполнения, и мне интересно, будет ли оно выполненосмысл ставить его последним, так как я не хочу запускать его, если одна из первых двух проверок неверна.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Оптимальный индекс для , для которого запрос равен

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 нарушается - как оптимизация.

Если у вас нет подходящих индексов, то позор вам.

Есть много возможностей.Я буду рад обсудить отдельные вопросы, но будет сложно сделать слишком много общих слов.

0 голосов
/ 23 ноября 2018

Оптимизатор SQL просматривает запрос в целом и пытается определить наиболее оптимальный план запроса для запроса.Порядок пунктов в выражении where не имеет значения.

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