Влияет ли порядок условий в предложении WHERE на производительность MySQL? - PullRequest
41 голосов
/ 15 июня 2010

Скажите, что у меня длинный, дорогой запрос, заполненный условиями, выполняющий поиск по большому количеству строк.У меня также есть одно конкретное условие, такое как идентификатор компании, которое ограничит число строк, которые необходимо значительно найти, сузив его до десятков от сотен тысяч.

Влияет ли это на производительность 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) 

Ответы [ 8 ]

21 голосов
/ 15 ноября 2016

Вот онлайн-демонстрация, демонстрирующая, что порядок условий предложения WHERE может иметь значение из-за короткого замыкания:

http://rextester.com/HJGN96158

Это выполняетсяследующие запросы:

-- query #1
SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1;

-- query #2
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

Выше показано, что медленная функция выполняется больше раз, когда она появляется слева от условия OR, когдадругой операнд не всегда верен.

Итак, IMO ответ на вопрос:

Влияет ли порядок условий в предложении WHERE на производительность MySQL?

- это «Иногда это возможно».

16 голосов
/ 15 июня 2010

Нет, заказ не должен иметь большого значения.При нахождении того, какие строки соответствуют условию, условие в целом (все подусловия, объединенные с помощью логической логики) проверяется для каждой строки.

Некоторые интеллектуальные механизмы DB пытаются угадать, какие части условияможет оцениваться быстрее (например, вещи, которые не используют встроенные функции) и оценивать их первыми, а более сложные (оценочно) элементы оцениваются позже.Это определяется механизмом БД, а не SQL.

5 голосов
/ 15 июня 2010

Порядок столбцов в предложении where на самом деле не должен иметь значения, поскольку MySQL оптимизирует запрос перед его выполнением. Но я предлагаю вам прочитать главу о Оптимизация в справочном руководстве по MySQL, чтобы получить общее представление о том, как анализировать запросы и таблицы и оптимизировать их при необходимости. Хотя лично я всегда старался бы помещать индексированные поля перед неиндексированными полями и упорядочивать их в соответствии с количеством строк, которые они должны возвращать (сначала самые ограничивающие условия, в конце наименее ограничительные).

4 голосов
/ 15 июня 2010

Математически Да Имеет эффект.Не только в SQL Query.скорее во всех языках программирования, когда есть выражение с and / or.Там работает теория полной оценки или частичной оценки.Если его запрос и первое выражение and оценивается как ложный, он больше не проверяет.так как anding false с чем-либо дает false.Аналогично в выражении или, если первое верно, оно больше не будет проверяться.

4 голосов
/ 15 июня 2010

Сложная СУБД должна быть в состоянии самостоятельно решить, какое условие в первую очередь необходимо оценить Некоторые базы данных предоставляют инструменты для отображения «стратегии» выполнения запроса. В MySQL, например Вы можете ввести EXPLAIN перед запросом . Затем СУБД печатает действия, которые она выполнила для выполнения запроса, например, индексное или полное сканирование таблицы. Таким образом, вы можете сразу увидеть, использует ли он индекс «компания» в обоих случаях.

3 голосов
/ 15 июня 2010

Я не думаю, что порядок предложения where имеет какое-либо влияние.Я думаю, что оптимизатор запросов MySQL реорганизует те предложения, которые он сочтет нужными, поэтому он сначала отфильтровывает самое большое подмножество.

Это еще одна сделка, когда речь идет об объединениях.Оптимизатор тоже пытается здесь изменить порядок, но не всегда находит лучший путь и иногда не использует индексы.ВЫБЕРИТЕ ПРЯМОЕ СОЕДИНЕНИЕ и ИНДЕКС СИЛЫ, чтобы вы отвечали за запрос.

3 голосов
/ 15 июня 2010

это не должно иметь никакого эффекта, но если вы не уверены, почему бы вам просто не попробовать это?порядок предложений where для выбора из одной таблицы не имеет значения, но если вы объедините несколько таблиц, порядок соединений может повлиять на производительность (иногда).

1 голос
/ 15 июня 2010

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

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