Поиск mysql like

Задача сравнительно простая, но нагруженный проект.

Есть поле в таблице varchar(255). В таблице много полей и порядка 300 000 строк, но будет расти примерно до 1 000 000.
Сейчас поиск осуществляется так name LIKE '%$name%' OR name '%$translit%'

Поиск подтормаживает.

В связи с этим есть вариант
вынести полностью в отдельную таблицу search поля id, name и использовать все тот же LIKE '%$name%"'

Ускорит ли это поиск?

Ну и второй вариант морочиться с FULLTEXT, но никогда им не пользовался, есть ли смысл? Судя по докам он обходит меньше строк.

Морфология не важна.

Третий вариант видел в форумах. Разбивать на слова и составить таблицу word index и искать по нему.

В какую сторону копать?
  • Вопрос задан
  • 21694 просмотра
Решения вопроса 1
jimmi
@jimmi
Была подобная задача. Вариант с разбивкой на слова и делать word index поможет.
В таблице с около 15 млн слов поиск шел 0,02 сек примерно. Даже приходилось записывать не полные слова вроде «купила», «купил»,«купи» для того чтобы пользователю не приходилось вводить всё слово.

>>LIKE '%$name%' OR name '%$translit%'

насчёт этого то можно ускорить поиск используя like вот так
LIKE '$name%' OR name '$translit%' т.е. индекс строиться с начала строи и далее, в случае если используется % в лайке вначале то собственно смысла в индексе уже нет. Но если не использовать % в начале лайка то нужно придумывать другую структуру поиска так как не все варианты будет находить.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
opium
@opium
Просто люблю качественно работать
1)Вынос ид и серч в отдельную таблицу не поможет.
2)ПОставьте сфинкс и забудьте про тормоза в поиске.
habrahabr.ru/blogs/sphinx/
Ответ написан
carbonariy
@carbonariy
FULLTEXT должен снизить нагрузку, но если у вас используется таблицы типа InnoDB, то придется продублировать поисковый индекс в таблицу типа MyISAM. Если не поможет и доступ к серверу ограничен, то попробуйте Zend Lucene
Ответ написан
taliban
@taliban
php программист
Третий вариант снизит нагрузку, я думаю, даже лучше чем фул текст, и мне кажется это лучший вариант.
Используя третий вариант Вам не надо будет использовать текстовые движки, просто банальное сравнение строки, это довольно таки быстрая операция, с миллионом должна справиться на ура, можете для теста забить пару миллионов случайных строк, и попробовать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы