Реальная разница заключается в методологиях сканирования. Для полнотекстового поиска слова (термины) используются в качестве ключей хеширования, каждое из которых связано с массивом документов, в которых появляются ключи (термины). Это выглядит так:
Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}
Теперь матрица терминов-документов (член-член какого документа) может быть представлена как:
t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}
Когда приходит запрос «Получить мне все документы, содержащие слово / термин t1» - тогда возвращается набор документов {d1, d5, d9,.. dn
}.
Вы можете взломать ненормализованную схему таблицы для хранения документов - каждая строка в таблице MySQL будет считаться «документом», а столбец TEXT может содержать абзац и т. Д. Инвертированный индекс будет содержать термины в качестве ключей хеш-функции и идентификаторы строк в качестве идентификаторов документов.
Помните, что этот SQL-запрос будет иметь более или менее высокую производительность O (1). Запрос не будет зависеть от
- Количество слов / терминов в столбце ТЕКСТ
- Количество строк / документов, соответствующих критериям
- Длина слова / терминов
Например, этот SQL может быть запущен для извлечения всех строк, соответствующих данному слову XYZ:
SELECT *
FROM my_table
WHERE MATCH (my_text_column) against ('XYZ' IN boolean mode) ;
Предупреждение: если вы добавите ORDER BY к этому запросу, время выполнения будет зависеть от нескольких параметров, одним из которых является количество совпадающих строк / документов. Так что будьте осторожны.
Однако в LIKE ничего этого нет. Он вынужден линейно сканировать предложение / строку и найти все совпадающие термины. Добавление джокера добавляет беспорядка. Как вы можете себе представить, он отлично работает с небольшими строками, но для более длинных предложений с треском провалится. И, безусловно, не сравнимо, когда есть параграф или целая страница текста и т. Д.