Порядок условий в операторе Where влияют на производительность MySQL?

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

Делает это имеет любое значение к производительности 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) 
43
задан fracz 14 April 2015 в 11:21
поделиться

7 ответов

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

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

17
ответ дан 26 November 2019 в 23:02
поделиться

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

4
ответ дан 26 November 2019 в 23:02
поделиться

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

4
ответ дан 26 November 2019 в 23:02
поделиться

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

3
ответ дан 26 November 2019 в 23:02
поделиться

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

1
ответ дан 26 November 2019 в 23:02
поделиться

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

5
ответ дан 26 November 2019 в 23:02
поделиться

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

Другое дело, когда речь идет о соединениях. Оптимизатор пытается переупорядочить и здесь, но не всегда находит лучший способ и иногда не использует индексы. SELECT STRAIGHT JOIN и FORCE INDEX позволяют вам быть ответственным за запрос.

3
ответ дан 26 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: