Я сейчас протестировал множество вариантов, основанных на совете Алексиса о регулярных выражениях, и ради других людей, имеющих дело с этой проблемой, я решил поделиться своими выводами.
На мой взгляд, лучшее решение заранее: используйте lower () для двоичных полей utf-8 в сочетании с регулярными выражениями для поиска целых ключевых слов.По крайней мере, что касается решений с одной таблицей.Я думаю, в конце концов, мой ответ на исходный вопрос будет иметь две таблицы.Тот, который содержит все тексты в нижнем регистре и используется для полнотекстового поиска, и тот, который содержит тексты, когда они отображаются пользователям.В два раза больше данных, но запросы с логическим поиском будут выполняться намного быстрее.
Во-первых, недвоичная таблица с полнотекстовым индексом в качестве ориентира:
SELECT * FROM texts WHERE MATCH (text1, text2, text3, text4) AGAINST ('psycho' in boolean mode)
Query took 0.0003 sec
Самое быстрое решение для двоичного файла:
SELECT * FROM texts_bin WHERE lower(text1) rlike 'psycho' OR lower(text2) rlike 'psycho' OR lower(text3) rlike 'psycho' OR lower(text4) rlike 'psycho'
Query took 0.0014 sec
Plus - другие проведенные мной тесты, которые могут оказаться полезными:
SELECT * FROM texts_bin WHERE lower(text1) like '%psycho%' OR lower(text2) like '%psycho%' OR lower(text3) like '%psycho%' OR lower(text4) like '%psycho%'
Query took 0.0023 sec
SELECT * FROM texts_bin WHERE text1 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text2 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text3 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)' OR text4 REGEXP '(P|p)(S|s)(Y|y)(C|c)(H|h)(O|o)'
Query took 0.0282 sec