В комментариях по проверке равенства SQL «length (col) = длина (?) И col =?»

Предыдущий разработчик имеет все свои Select * from TABLE where COLUMN = value; с дополнительной проверкой, чтобы предложение where было length(COLUMN) = length(value) and COLUMN = value при выполнении проверок на равенство для столбцов типа String.

Причина (как я понимаю) заключается в том, что выполнение проверки длины может быть быстрее и, следовательно, повысить производительность запросов такого типа. Мои чувства

  • если это касается, почему бы не использовать индекс на БД? (Я не проверял, но они уже могут быть там)
  • может ли он вообще улучшить запрос, и если вообще будет ли он специфичным для определенного движка или версии БД?
  • может ли быть хуже?
  • если это намного лучше, не будет ли механизм БД выполнять свою собственную проверку под прикрытием? (например, составление операторов и оптимизация)
  • при каких условиях кто-нибудь на самом деле заметит это изменение?
  • это приводит к некоторому (положительному или отрицательному) побочному эффекту типа DB?

Я полагаю, что изначально он был нацелен на MySQL 5.1, и сейчас мы находимся на MySQL 5.7, но мой запрос комментариев не является специфическим для них. Мой гугл-фу ничего не дал по теме, но пахнет преждевременной оптимизацией.

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

Всего 1 ответ


Как упомянуто в комментарии, это обрабатывает пробелы в конце строки.

Как вы можете видеть в этой db <> скрипке :

select ('abc' = 'abc '), length('abc'), length('abc ')

MySQL не поддерживает (в упомянутых вами версиях) ограничения проверки. Поэтому не существует простого способа предотвратить пробелы в конце строк.

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

Я думаю, что вместо этого рекомендую использовать BINARY для получения точного соответствия:

('abc' = binary 'abc ')

Я не уверен, что это приведет к неожиданным последствиям.


Есть идеи?

10000