0

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

12

Описание проблемы:

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

Вопрос заключается в том, влияет ли на производительность MySQL то, как я формирую запрос. Рассматриваю два варианта:

  1. Первый вариант запроса:
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
  1. Второй вариант запроса:
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 ответ(ов)

0

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

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

0

С математической точки зрения, да – это действительно имеет значение. Это касается не только SQL-запросов, но и всех языков программирования, когда возникает выражение с операторами and / or.

Здесь работает теория полной и частичной оценки. Если у вас есть выражение с оператором and и первое условие оценивается как ложное, то дальнейшие проверки не будут выполнены, так как логическое сложение ложного значения с чем-либо иного также дает ложь.

Аналогично, в случае выражения с оператором or, если первое условие истинно, то дальнейшие проверки также не будут производиться, так как истина с чем-либо иным дает истину.

0

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

0

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

Другое дело — когда речь идет о соединениях (JOIN). Оптимизатор также пытается изменить порядок соединений, но не всегда находит оптимальный вариант и иногда не использует индексы. Использование SELECT STRAIGHT_JOIN и FORCE INDEX позволяет вам взять управление над запросом в свои руки.

0

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь