Подтвердить что ты не робот

Использование LIKE vs. = для точного соответствия строк

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

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

SELECT field WHERE 'a' = 'a';

Или:

SELECT field WHERE 'a' LIKE 'a';

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

4b9b3361

Ответ 1

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

Ответ 2

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

Однако оператор 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