Как стать автором
Обновить

Поиск: FULLTEXT или LIKE?

MySQL *
Наверное каждый разработчик подходил к моменту выбора между двумя решениями одной задачи и естесвенно решающим фактором выбора является наиболее быстрый способ (по времени процесса). Так и я в ходе разработки поиска для своей CMS задался вопросом: что лучше, делать поиск по базе используя полнотекстовой индекс или с помощью оператора сравнения LIKE, имея небольшое количество информации.

Для того, чтобы ответить на свой вопрос я провел небольшой опыт: создал таблицу с четырмя полями (два из которых использовались для поиска и были проиндексированы FULLTEXT'ом) содержащую 5 000 строк. Поля по которым производился поиск содержали по 255 символов, случайно выбранных из одного большого текста. Поиск производился так же по случайным словам не короче 4-х символов.

На первом этапе искалось одно слово в одном поле. На втором этапе в одном поле искалось одно из двух слов. На третьем этапе искалось одно из двух слов в обоих полях. На всех этапах поиск производился сначала с помощью конструкции MATCH(имя_поля) AGAINST('искомый_текст') потом с помощью LIKE.

Примечание: тестировал на домашнем компьютере AMD 64 X2 4200, 2GB RAM, Apache, MySQL 5.0.

Количество запросов на каждом этапе — 100. Частота — один раз в секунду.

Итоги теста



На графике показано среднее время выполнения поисковых запросов на 3-х этапах.



Честно говоря, я ожидал немного другой заваисимости времени от сложности запроса и четкую границу между типами поисковых запросов. Но это объясняется тем, что поиск по FULLTEXT-индексу учитывает морфологию слова (при установленном дополнении и русской), что и создает дополнительную нагрузку.

Преимущества и недостатки



Преимущества поиска с помощью оператора LIKE:
  • незначительное увеличение времени обработки запроса при увеличении его сложности
  • возможность сортировки результатов
  • универсальность: можно использовать для поиска рпактически по любым типам полей, в отличии от полнотекстового


Недостатки LIKE:
  • отсутствие поддержки морфологии
  • отсутствие модификаторов
  • поиск по всем строкам


Преимущества полнотекстового поиска:
  • поддержка морфологии
  • выдача результатов по релевантности
  • наличие модификаторов, схожих с модификаторами в поске Гугла и Яндекса
  • стоп-слова
  • возможность настройки


Недостатки:
  • отсутствие возможности сортировки
  • поддержка только VARCHAR и TEXT полей с индексами FULLTEXT
  • ресурсоемкий процесс
  • изначальная поддержка только MyISAM таблиц
  • при установленном ключе FULLTEXT добавление данных в таблицу происходи дольше


Эпилог


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

UPD: Под разными ситуациями подразумеваются случаи с разным количеством строк в таблице. Оператор LIKE лучше когда записей не огромное количество и он не применим в таблицах с сотнями тысяч строк, по причине того, что поиск, производится по всем записям.

P.S.: прочитать про полнотекстовой поиск можно здесь.
Теги:
Хабы:
Всего голосов 52: ↑46 и ↓6 +40
Просмотры 36K
Комментарии Комментарии 67