Для "desc начинается с":
"Начинается с:
REGEXP: '^engineer...'
LIKE: 'engineer%...'
Складывание кейса:
If the collation of the column is `..._ci`, then do _not_ waste time with `LOWER()`.
Итак, этооптимально для нахождения desc
, который начинается с"инженер" или "инженер" или "инженер", и т. д .:
WHERE t.desc LIKE 'engineer%'
Если вы действительно имели в виду "где содержится описание 'инженер' или ... ", затем
WHERE t.desc REGEXP '[[:<:]]engineer'
Но лучшим способом было бы использовать FULLTEXT(desc)
и использовать это; оно позволяет слову находиться где угодно в desc
и desc
может быть TEXT
.
WHERE MATCH(desc) AGAINST('+engineer*' IN BOOLEAN MODE)
Вы должны выбрать один из вариантов на основе фактических требований. Между тем, вот их относительная производительность:
LOWER(desc) ...
- плохо, независимо от остальной части пункта LIKE 'engineer%'
- отлично, если у вас есть INDEX(desc)
LIKE 'engineer%'
- плохо без индекса или с префиксом:INDEX(desc(100))
MATCH...
- отлично из-за индекса FULLTEXT
. REGEXP ...
- плохо, проверяет каждую запись
Для "есть слово, которое начинается или заканчивается на":
Вам нужно перечислить положительные и отрицательные тестовые случаи:
engineering blah
The engineer.
MechanicalEngineering -- neither starts nor ends at word boundary??
engineer
Если все они верны, то это единственный жизнеспособный ответ:
WHERE t.desc LIKE '%engineer%'
эквивалент REGEXP 'engineer'
медленнее (но имеет тот же эффект).
В других ситуациях я хотел бы взглянуть на что-то близкое к
WHERE t.desc REGEXP '[[:<:]]engineer|engineer[[:>:]]'
, которое ищет "слово", которое начинается илизаканчивается «инженером».Обратите внимание, что сюда не входит «Механический инжиниринг».