SQL LIKE BINARY медленнее, чем обычный LIKE? - PullRequest
6 голосов
/ 11 ноября 2011

Я использую приложение django, которое выполняет некоторые ORM-операции «старты с», сравнивая longtext столбцы со строкой Юникода.Это приводит к операции сравнения LIKE BINARY со строкой Unicode u'mystring'.Может ли LIKE BINARY работать медленнее, чем обычный LIKE?

Я знаю, что общий ответ - это бенчмаркинг, но я хотел бы получить общее представление о базах данных в целом, а не только о моем приложении, так как я бы хотелникогда раньше не видел запрос LIKE BINARY.

Я использую MySQL, но мне интересен ответ для баз данных SQL в целом.

Ответы [ 3 ]

5 голосов
/ 11 ноября 2011

Если производительность кажется проблемой, то может быть хорошей идеей для создания копии первого, например.255 символов длинного текста, добавьте индекс к этому и используйте startswith с этим.

КСТАТИ, на этой странице написано : "если вам нужно сопоставление с учетом регистра, объявитеваш столбец как BINARY; не используйте LIKE BINARY в своих запросах для приведения недвоичного столбца. Если вы это сделаете, MySQL не будет использовать индексы для этого столбца. "Это старый совет, но я думаю, что он все еще действителен.

2 голосов
/ 11 сентября 2012

Для следующего человека, который сталкивается с этим - в нашей относительно небольшой базе данных запрос:

SELECT * FROM table_name WHERE field LIKE 'some-field-search-value';

... Result row

Returns 1 row in set (0.00 sec)

По сравнению с:

SELECT * FROM table_name WHERE field LIKE BINARY 'some-field-search-value';

... Result row

Returns 1 row in set (0.32 sec)

Короче говоря, по крайней мере для нашей базы данных (MySQL 5.5 / InnoDB) существует очень существенная разница в производительности между двумя поисками.

Очевидно, что это ошибка в MySQL 5.5: http://bugs.mysql.com/bug.php?id=63563, и в моем тестировании с той же базой данных в MySQL 5.1 запрос LIKE BINARY все еще использует индекс (в то время как в 5.5 он выполняет полное сканирование таблицы).

0 голосов
/ 14 апреля 2019

Подвох: если вы не хотите менять тип столбца на двоичный, попробуйте написать свое выражение 100 WHERE следующим образом:

WHERE field = 'yourstring' AND field LIKE BINARY 'yourstring'

вместо:

WHERE field LIKE BINARY 'yourstring'

Действительно, он очень быстро проверит первое условие и попробует второе, только если первое верно.

Это хорошо сработало в моем проекте для этого теста на равенство, и я думаю,Вы можете адаптировать его к тесту «начинается с».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...