2016-06-09 3 views
0

Я работаю с базой данных MySQL, но этот вопрос может быть применим к SQL, Oracle и т. Д.Лучше ли использовать равные или не равные при выполнении запроса?

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

Таким образом,

является его более эффективным/быстрее (или же), чтобы посмотреть на результаты, равные или что-то не равны? и почему ...

+0

Вы пытались выполнить какие-либо тесты, чтобы определить тайминги? – csmckelvey

+0

Возможный дубликат: http://stackoverflow.com/questions/7419251/sql-server-operator-is-very-slow-compared-to-on-table-with-a-few-millio. Мое понимание всегда было равным, а производительность лучше, чем нет, из-за лучшего использования индексации. Но вы, как правило, не видите проблемы, подобные тому, что человек часто испытывает в этом вопросе, где он составляет 1 секунду> 15 минут. – Dresden

+0

Да, я только что видел этот вопрос, и это не кажется нормальным, это может помочь, но – davidivad

ответ

1

Производительность является одной из причин использования =. Для этого есть два компонента. Сначала это индексирование, где сравнения = обеспечивают более мощные возможности индексирования. Второй - разбиение. Хотя маловероятно, что в столбце, который принимает только несколько значений, = лучше для разрешения разделов.

Другая причина - семантическая. Наличие NULL s может ввести в заблуждение. Рассмотрим два сравнения:

where col = 'x' 
where col <> 'x' 

Оба этих where положений отфильтровывать значения где col является NULL. Это делает общий смысл с =. Однако даже после того, как вы знаете правила, это немного путается с <>. Интуитивно мы считаем, что «NULL не равно« x », поэтому он должен быть правдой». Фактически, NULL означает неизвестное значение, а неизвестное значение может быть равно 'x', поэтому заявление может быть истинным; Фактически, он возвращает NULL, который отфильтровывается.

0

С точки зрения производительности вы хотели бы использовать equals, чтобы использовать индексирование.

С логической точки зрения было бы опасно использовать «не равно». В этом случае вы можете удалить неожиданные данные. 1. Получить список брендов 2. Представить список пользователю 3. Другое действие вставляет новый бренд X 4. Пользователь выбирает, какие марки сохранить и нажимать удалить. 5. Бренд x был непреднамеренно удален.

Смежные вопросы