Использование LIKE vs. = для точного соответствия строк
Во-первых, я понимаю различия между ними:
- Как и делает доступными шаблоны% и _
- значимые пробелы в пробеге
- проблемы с коллажами
При прочих равных условиях для точного соответствия строк, которое более эффективно:
SELECT field WHERE 'a' = 'a';
Или:
SELECT field WHERE 'a' LIKE 'a';
Или: Разница настолько незначительна, что это не имеет значения?
Ответы
Ответ 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