Подтвердить что ты не робот

Оказывает ли порядок условий в выражении 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) 
4b9b3361

Ответ 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

Нет, нет, требуемые таблицы выбираются, а затем оцениваются по строкам. Порядок может быть произвольным.