Использование LIKE vs. = для точного соответствия строк - PullRequest
31 голосов
/ 18 февраля 2009

Во-первых, я распознаю разницу между ними:
- Like делает доступными символы подстановки% и _
- значительный конечный пробел
- проблемы с коляцией

При прочих равных условиях для более точного совпадения строк:

SELECT field WHERE 'a' = 'a';

Или:

SELECT field WHERE 'a' LIKE 'a';

Или: разница настолько незначительна, что не имеет значения?

Ответы [ 2 ]

32 голосов
/ 18 февраля 2009

Я бы сказал, что компаратор будет быстрее. Лексическое не отправляет сравнение в другую лексическую систему для общего сопоставления. Вместо этого двигатель может просто соответствовать или двигаться дальше. Наша база данных на работе имеет миллионы строк, а an = всегда быстрее.

5 голосов
/ 18 февраля 2009

В приличной СУБД механизм БД распознал бы, что в строке не было подстановочных знаков, и неявно превратил ее в чистое равенство (не обязательно совпадающее с =). Таким образом, вы получите лишь небольшой удар по производительности в начале, обычно незначительный для любого приличного размера запроса.

Однако оператор MySQL = не обязательно действует так, как вы ожидаете (как проверка на чистоту). В частности, он по умолчанию не учитывает конечные пробелы для данных CHAR и VARCHAR, что означает:

SELECT age WHERE name = 'pax'

даст вам строки для 'pax', 'pax<one space>' и 'pax<a hundred spaces>'.

Если вы хотите выполнить правильную проверку на равенство, используйте ключевое слово binary:

SELECT field WHERE name = binary 'pax'

Вы можете проверить это с помощью чего-то вроде:

mysql> create table people (name varchar(10));

mysql> insert into people value ('pax');
mysql> insert into people value ('pax ');
mysql> insert into people value ('pax  ');
mysql> insert into people value ('pax   ');
mysql> insert into people value ('notpax');

mysql> select count(*) from people where name like 'pax';
1

mysql> select count(*) from people where name = 'pax';
4

mysql> select count(*) from people where name = binary 'pax';
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...