Влияет ли порядок условий в 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)
Будет ли разница в производительности при выполнении этих двух вариантов, учитывая, что одно из условий (company = :ugh) значительно сужает выборку строк?
5 ответ(ов)
Нет, порядок не должен существенно влиять на результат. При проверке, какие строки соответствуют условию, все условия в целом (все подусловия, объединенные с помощью логики булевых операций) рассматриваются для каждой строки.
Некоторые продвинутые СУБД пытаются предположить, какие части условия можно оценить быстрее (например, те, которые не используют встроенные функции), и оценивают их первыми, а более сложные (по оценке) элементы — позже. Однако это определяется движком базы данных, а не самим SQL.
С математической точки зрения, да – это действительно имеет значение. Это касается не только SQL-запросов, но и всех языков программирования, когда возникает выражение с операторами and
/ or
.
Здесь работает теория полной и частичной оценки. Если у вас есть выражение с оператором and
и первое условие оценивается как ложное, то дальнейшие проверки не будут выполнены, так как логическое сложение ложного значения с чем-либо иного также дает ложь.
Аналогично, в случае выражения с оператором or
, если первое условие истинно, то дальнейшие проверки также не будут производиться, так как истина с чем-либо иным дает истину.
Это не должно оказать никакого влияния, но если вы не уверены, почему бы просто не попробовать? Порядок where-условий в запросах к одной таблице не имеет значения, но при соединении нескольких таблиц порядок соединений может повлиять на производительность (иногда).
Я не думаю, что порядок условий в WHERE влияет на оптимизацию запроса. Я считаю, что оптимизатор запросов MySQL реорганизует условия WHERE так, как считает нужным, чтобы сначала отфильтровать наибольший подмножество данных.
Другое дело — когда речь идет о соединениях (JOIN). Оптимизатор также пытается изменить порядок соединений, но не всегда находит оптимальный вариант и иногда не использует индексы. Использование SELECT STRAIGHT_JOIN
и FORCE INDEX
позволяет вам взять управление над запросом в свои руки.
Нет, это не так. Необходимые таблицы выбираются, а затем оцениваются построчно. Порядок может быть произвольным.
SQL: выбрать только строки с максимальным значением в столбце
Когда использовать одинарные кавычки, двойные кавычки и обратные кавычки в MySQL
Удаление с использованием JOIN в MySQL
MySQL 1062 - Дубликат значения '0' для ключа 'PRIMARY'
java.sql.SQLException: Не найден подходящий драйвер для jdbc:mysql://localhost:3306/dbname