2009-09-03 3 views
0

Если значение @param равно нулю, что лучше использовать:Правильные Дополнительные параметры в MySQL

  1. WHERE t.column = COALESCE(@param, '')
  2. WHERE t.column = IFNULL(@param, '')
  3. WHERE (@param IS NULL OR t.column = @param)

Является ИЛИ дороже сравнивая столбец со значением, которое будет возвращать все значения для указанного столбца? Мое понимание заключается в том, что опции 1 & 2 заставят сканирование полной таблицы каждый раз, а # 3 - нет.

ответ

0

3 лучше всего, потому что оптимизатор будет замыкать эту оценку во время этапа оптимизатора и исключить предложение where.

0

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

0

Вариант 2 выглядит как синтаксическая ошибка; ISNULL принимает только один параметр и возвращает логическое значение.

Варианты 1 и 3 могут возвращать разные значения. Когда @param имеет значение null, параметр 1 возвращает только строки, где t.column - пустая строка, где опция 3 возвращает все строки. Любой из них будет использовать полное сканирование таблицы, если у вас нет индекса на t.column; даже тогда опция 3 будет использовать полное сканирование, когда @param равно null.

+0

Мой плохой - ISNULL изменен как IFNULL, спасибо. –

+0

Почему вы полагаете, что вариант 3 выполнил бы полное сканирование таблицы, если @param должен был быть нулевым? Пройдет первая половина теста; вторая часть не должна выполняться. –

+0

Я предполагаю, что это не совсем «сканирует» всю таблицу так, как возвращает всю вещь. Это то, что вы хотите? – eswald

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