Скажите, что у меня есть долгий, дорогой запрос, упакованный условиями, ища большое количество строк. У меня также есть одно конкретное условие, как идентификатор компании, который ограничит количество строк, которые должны значительно искаться, сужая его к десяткам от сотен тысяч.
Делает это имеет любое значение к производительности 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)
Нет, порядок не должен иметь большого значения. При нахождении строк, соответствующих условию, условие в целом (все подусловия, объединенные с помощью логической логики) проверяется для каждой строки.
Некоторые интеллектуальные механизмы БД будут пытаться угадать, какие части условия могут быть оценены быстрее (например, вещи, которые не используют встроенные функции), и оценивают их первыми, а более сложные (ориентировочные) элементы оцениваются позже. . Однако это определяется механизмом БД, а не SQL.
Сложная СУБД должна иметь возможность самостоятельно решать, какое условие оценивать в первую очередь. Некоторые базы данных предоставляют инструменты для отображения «стратегии» выполнения запроса. В MySQL, например вы можете ввести EXPLAIN
перед запросом . Затем СУБД распечатывает действия, которые она выполнила для выполнения запроса, например, индексное или полное сканирование таблицы. Таким образом, вы могли сразу увидеть, использует ли он индекс для «компании» в обоих случаях.
Математически да Это имеет эффект. Не только в SQL Query. скорее во всех языках программирования, когда есть выражение с and
/ or
.
Существует теория полной или частичной оценки.
Если это запрос на and и первое выражение and
оценивается как false, он не будет проверять дальше. так как соединение false с чем-либо дает false.
Аналогично в выражении or, если первое выражение истинно, то оно не будет проверяться дальше.
это не должно иметь никакого эффекта, но если вы не уверены, почему бы вам просто не попробовать? Порядок пунктов where в select из одной таблицы не имеет никакого значения, но если вы соединяете несколько таблиц, порядок соединений может повлиять на производительность (иногда).
Нет, это не так, необходимые таблицы выбираются, а затем оцениваются строка за строкой. Порядок может быть произвольным.
Порядок колонок в предложении where не должен иметь значения, поскольку MySQL оптимизирует запрос перед его выполнением. Но я советую вам прочитать главу Оптимизация в справочном руководстве MySQL, чтобы получить базовое представление о том, как анализировать запросы и таблицы и оптимизировать их при необходимости. Лично я всегда стараюсь помещать индексированные поля перед неиндексированными и упорядочивать их по количеству строк, которые они должны вернуть (наиболее ограничивающие условия первыми, наименее ограничивающие последними).
Я не думаю, что порядок в предложении where имеет какое-либо влияние. Я думаю, что оптимизатор запросов MySQL реорганизует клаузулы where по своему усмотрению так, чтобы отфильтровать сначала самое большое подмножество.
Другое дело, когда речь идет о соединениях. Оптимизатор пытается переупорядочить и здесь, но не всегда находит лучший способ и иногда не использует индексы. SELECT STRAIGHT JOIN и FORCE INDEX позволяют вам быть ответственным за запрос.