Сведения о вопросе

HOLY

21:06, 1st October, 2020

Теги

MySQL    

Поиск mysql like

Просмотров: 358   Ответов: 4

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

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

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

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

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

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

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

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

В какую сторону копать?



  Сведения об ответе

lool

13:43, 25th September, 2020

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

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

насчёт этого то можно ускорить поиск используя like вот так
LIKE '$name%' OR name '$translit%' т.е. индекс строиться с начала строи и далее, в случае если используется % в лайке вначале то собственно смысла в индексе уже нет. Но если не использовать % в начале лайка то нужно придумывать другую структуру поиска так как не все варианты будет находить.


  Сведения об ответе

+-*/

00:29, 25th September, 2020

1)Вынос ид и серч в отдельную таблицу не поможет.
2)ПОставьте сфинкс и забудьте про тормоза в поиске.
habrahabr.ru/blogs/sphinx/


  Сведения об ответе

VCe znayu

01:42, 28th September, 2020

FULLTEXT должен снизить нагрузку, но если у вас используется таблицы типа InnoDB, то придется продублировать поисковый индекс в таблицу типа MyISAM. Если не поможет и доступ к серверу ограничен, то попробуйте Zend Lucene


  Сведения об ответе

lool

01:16, 30th September, 2020

Третий вариант снизит нагрузку, я думаю, даже лучше чем фул текст, и мне кажется это лучший вариант.
Используя третий вариант Вам не надо будет использовать текстовые движки, просто банальное сравнение строки, это довольно таки быстрая операция, с миллионом должна справиться на ура, можете для теста забить пару миллионов случайных строк, и попробовать.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться