Оказывает ли порядок условий в выражении WHERE влиять на производительность MySQL?
Скажите, что у меня длинный дорогостоящий запрос, заполненный условиями, поиск большого количества строк. У меня также есть одно конкретное условие, такое как идентификатор компании, который будет ограничивать количество строк, которые нужно тщательно искать, сужая его до десятков тысяч сотен тысяч.
Не имеет значения, насколько я могу это сделать:
SELECT * FROM clients WHERE
(firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND
(firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) AND
company = :ugh
или это:
SELECT * FROM clients WHERE
company = :ugh AND
(firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND
(firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar)
Ответы
Ответ 1
Нет, порядок не должен иметь большого значения. При определении того, какие строки соответствуют условию, условие в целом (все вспомогательные условия, объединенные логической логикой) проверяется для каждой строки.
Некоторые интеллектуальные БД-механизмы будут пытаться угадать, какие части условия могут быть оценены быстрее (например, вещи, которые не используют встроенные функции), и оценивать их сначала, а более сложные (оцениваемые) элементы получают позже, Это то, что определяется движком БД, но не SQL.
Ответ 2
Я обнаружил, что не согласен с принятым ответом и настроил тест, чтобы попытаться это доказать:
http://rextester.com/HJGN96158
Здесь выполняются следующие запросы:
SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1;
SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;
Единственное различие между ними - порядок операндов в условии OR.
myslowfunction
намеренно спит в течение секунды и имеет побочный эффект добавления записи в таблицу журнала каждый раз, когда она запускается. Вот результаты того, что регистрируется при выполнении вышеуказанных двух запросов:
myslowfunction called for query #1 with value 1
myslowfunction called for query #1 with value 2
myslowfunction called for query #2 with value 1
myslowfunction called for query #2 with value 2
myslowfunction called for query #2 with value 3
myslowfunction called for query #2 with value 4
Вышеприведенное показывает, что медленная функция выполняется больше раз, когда она появляется в левой части условия ИЛИ, когда другой операнд не всегда истинен (из-за короткого замыкания).
Итак, ИМО ответ на вопрос:
Влияет ли порядок условий в предложение WHERE на производительность MySQL?
является
"Да, иногда это может сделать".
Ответ 3
Усовершенствованная СУБД должна быть в состоянии самостоятельно решить, где, в первую очередь, должно оцениваться условие. Некоторые базы данных предоставляют инструменты для отображения "стратегии", как выполняется запрос. В MySQL, например. вы можете ввести EXPLAIN
перед запросом. Затем СУБД печатает действия, выполняемые для выполнения запроса, например, индексирование или полноэкранное сканирование. Таким образом, вы можете сразу увидеть, использует ли он индекс для "компании" в обоих случаях.
Ответ 4
Порядок столбцов в предложении where не должен иметь значения, поскольку MySQL будет оптимизировать запрос перед его выполнением. Но я предлагаю вам прочитать главу Optimization в справочном руководстве MySQL, чтобы получить основную идею о том, как анализировать запросы и таблицы, и при необходимости оптимизировать их. Лично я всегда старался помещать индексированные поля перед неиндексированными полями и заказывать их в соответствии с количеством строк, которые они должны возвращать (в большинстве случаев ограничительные условия, наименее ограничивающие).
Ответ 5
это не должно иметь никакого эффекта, но если вы не уверены, почему бы вам просто не попробовать? порядок where-clauses при выборе из одной таблицы не имеет значения, но если вы присоединитесь к нескольким таблицам, порядок соединений может повлиять на performace (иногда).
Ответ 6
Я не думаю, что порядок предложения where имеет какое-то влияние. Я думаю, что оптимизатор запросов MySQL будет реорганизовать, где предложения, как он считает нужным, поэтому сначала отфильтровывает самое большое подмножество.
Это еще одна сделка, когда речь идет о объединениях. Оптимизатор также пытается изменить порядок здесь, но не всегда находит лучший способ и иногда не использует индексы. SELECT STRAIGHT JOIN и FORCE INDEX позволяют вам отвечать за запрос.
Ответ 7
Математически Да. Это имеет эффект. Не только в SQL Query. а во всех языках программирования всякий раз, когда есть выражение с and
/or
.
Там работает теория полной оценки или частичной оценки.
Если его an и запрос и первое выражение and
оцениваются как false, он не будет проверять далее. поскольку ложь с чем-либо дает ложь.
Similerly в выражении или, если первое верно, оно не будет проверяться далее.
Ответ 8
Нет, нет, требуемые таблицы выбираются, а затем оцениваются по строкам. Порядок может быть произвольным.