Что лучше для выступлений: IN или OR - PullRequest
4 голосов
/ 01 ноября 2011

Мне нужно сделать запрос, чтобы проверить, является ли значение столбца 2117 или 0.

В настоящее время я делаю это с помощью ИЛИ

select [...] AND (account_id = 2117 OR account_id = 0) AND [...]

Поскольку у меня проблемы с производительностью, я бродил, не лучше ли это сделать

select [...] AND account_id IN (0, 2117) AND [...]

Команда объяснения дает одинаковые результаты в обоих случаях. Так что, возможно, это больше касается оптимизации фазы разбора, чем чего-либо еще. Или, может быть, эти два способа полностью эквивалентны и оптимизированы MySQL, и мне просто наплевать.

На веб-сайте mySQL они говорят об оптимизации OR следующим образом:

Используйте x = ANY (таблица, содержащая (1,2)), а не x = 1 ИЛИ x = 2.

Но я неправильно понял синтаксис или даже не понял, почему.

Что вы думаете?

Ответы [ 4 ]

2 голосов
/ 01 ноября 2011

Здесь нет никакого конкурса ... IN - это всегда намного, намного лучше.

Причина в том, что базы данных не будут использовать индекс с OR,но будет использовать индекс с IN.

. Изменение OR на IN обычно является первой оптимизацией, которую я выполняю для запросов.

1 голос
/ 01 ноября 2011

Почему бы не попробовать выполнить тяжелый тест? Если разница заметна, выберите лучший вариант, в противном случае просто используйте «ИЛИ» для удобства чтения. Возможно, исходный код даст некоторые полезные ответы, но это может быть за пределами эффективности.

0 голосов
/ 01 ноября 2011

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

0 голосов
/ 01 ноября 2011

В нем, как правило, легче читать и обрабатывать с помощью двигателя ... Тем не менее, это говорит на основе некоторого ограниченного числа. Вы не хотите использовать IN или OR с 20+ идентификаторами (обычно). Когда вы попадаете в ситуацию, когда существует множество чисел, создайте таблицу (даже временную таблицу), вставьте значения, на основе которых вы хотите объединить, и затем используйте это в качестве основы SQL-соединения для ваших результатов. Обеспечивает большую гибкость при работе с большими выборками данных.

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