MYSQL - разница между IN и EXIST - PullRequest
9 голосов
/ 22 октября 2010

MySql вопрос:

В чем разница между [NOT] IN и [NOT] EXIST при выполнении подзапросов в MySql.

Ответы [ 2 ]

11 голосов
/ 22 октября 2010

СУЩЕСТВУЕТ

EXISTS буквально предназначен для проверки существования указанных критериев. В текущем стандартном SQL это позволит вам указать более одного критерия для сравнения - IE, если вы хотите знать, когда оба col_a и col_b совпадают, - что делает его немного сильнее, чем предложение IN. MySQL IN поддерживает кортежи, но синтаксис не переносимый, поэтому EXISTS является лучшим выбором как для удобочитаемости, так и для переносимости.

Другая вещь, о которой нужно знать с EXISTS, это то, как она работает - EXISTS возвращает логическое значение и возвращает логическое значение при первом совпадении. Поэтому, если вы имеете дело с дубликатами / кратными, EXISTS будет выполняться быстрее, чем IN или JOIN, в зависимости от данных и потребностей.

IN

IN - синтаксический сахар для предложений OR. Хотя это очень удобно, есть проблемы с большим количеством значений для этого сравнения (к северу от 1000).

НЕ

Оператор NOT просто меняет логику.

Подзапросы против JOINs

Мантра «всегда использовать соединения» ошибочна, потому что СОЕДИНЕНИЯ рискуют раздувать результирующий набор, если имеется более одной дочерней записи по отношению к родителю. Да, вы можете использовать DISTINCT или GROUP BY, чтобы справиться с этим, но это весьма вероятно, это делает выигрыш в производительности с помощью JOIN спорно. Знайте свои данные и то, что вы хотите для набора результатов - это ключ к написанию SQL, который хорошо работает.

Чтобы еще раз знать, когда и зачем знать, что использовать - LEFT JOIN IS NULL - это самый быстрый список исключений в MySQL , если сравниваемые столбцы НЕ обнуляются , иначе НЕ IN / НЕ СУЩЕСТВУЕТ - лучший выбор.

Справка:

3 голосов
/ 22 октября 2010

Они работают по-разному:

  • EXISTS принимает один аргумент, который должен быть подзапросом (производной таблицей), и проверяет, есть ли хотя бы одна строка, возвращенная подзапросом.
  • IN принимает два аргумента, первый из которых должен быть единственным значением (или кортежем), а второй - подзапросом или кортежем и проверяет, содержится ли первое значение во втором.

Однако оба могут использоваться для проверки того, имеет ли строка в таблице A совпадающую строку в таблице B. Если вы не будете осторожны и не будете знать, что делаете, я бы остался в стороне от IN в MySQL, поскольку он часто дает гораздо более низкую производительность при большем количествесложные запросы.Используйте NOT EXISTS или LEFT JOIN ... WHERE ... NULL.

...