@Noob--Saibot

Поиск по таблице, как сделать?

Привет всем. Подскажите пожалуйста, как сделать быстрый релевантный поиск по таблице с большим количеством строк. Есть таблица:
CREATE TABLE `sale` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brand` varchar(255) DEFAULT NULL,
  `gname` varchar(255) DEFAULT NULL,
  `sku` varchar(255) DEFAULT NULL,
  `price` varchar(255) DEFAULT NULL,
  `description` text,
  `tagdescription` varchar(255) DEFAULT NULL,
  `tagtitle` varchar(255) DEFAULT NULL,
  `tagkeywords` varchar(255) DEFAULT NULL,
  `adddate` datetime DEFAULT NULL,
  `image` varchar(255) DEFAULT NULL,
  `photos` text,
  `url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `url` (`url`) USING BTREE,
  FULLTEXT KEY `brand` (`brand`),
  FULLTEXT KEY `sku` (`sku`),
  FULLTEXT KEY `description` (`description`),
  FULLTEXT KEY `tagdescription` (`tagdescription`),
  FULLTEXT KEY `tagtitle` (`tagtitle`),
  FULLTEXT KEY `tagkeywords` (`tagkeywords`),
  FULLTEXT KEY `price` (`price`),
  FULLTEXT KEY `gname` (`gname`)
) ENGINE=MyISAM AUTO_INCREMENT=1734271 DEFAULT CHARSET=utf8;


Делаю в ней поиск на php таким образом:
$result = mysql_query("SELECT *, MATCH brand AGAINST ('".$_GET['q']."') + MATCH gname AGAINST ('".$_GET['q']."') + MATCH description AGAINST ('".$_GET['q']."') + MATCH tagdescription AGAINST ('".$_GET['q']."') as relev FROM sale HAVING relev>0 ORDER BY relev DESC");

При количестве записей 1 734 271, поиск выполняется за 4.1535229682922 сек., что очень долго. Как сделать быстро?)
  • Вопрос задан
  • 360 просмотров
Пригласить эксперта
Ответы на вопрос 4
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
на каком-нибудь значении полей типа xxx');drop table sale -- твой поиск закончится.
Ответ написан
gromdron
@gromdron
Работаю с Bitrix24
А как насчет сделать таблицу search_entity в которую положить:
`id` int(11) NOT NULL AUTO_INCREMENT,
`sale_id` int(11) NOT NULL,
`text` text,

Причем FULLTEXT KEY `text` (`text`)

И делать запись 1к1 в данное поле.
Причем text - это все поля через пробел, можно без знаков препинания, союзов и т.п.
Тогда поиск будет по отдельной таблице, можно сделать собственное ранжирование (например добавить ключ sort) и выделять нужные поля.
Ответ написан
Комментировать
Обязательно сделайте защиту от инъекций. Нельзя никогда и ни за что напрямую вставлять в SQL запросы данные из $_GET, $_POST и прочие без каких-либо проверок (https://habrahabr.ru/post/148701/).

По вопросу - посмотрите в сторону Elastic Search или Sphinx. На одном проекте Sphinx крайне сильно заметно ускоряет поиск
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
Сделайте поиск через sphinx
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы