Как оптимизировать запрос с ORDER BY и FULLTEXT search?

Имеется таблица на 12 млн. строк.
CREATE TABLE `shingles` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `shingle` text NOT NULL,
 `count` int(11) NOT NULL,
 `used` tinyint(1) DEFAULT NULL,
 `stop` tinyint(1) DEFAULT NULL,
 `date` tinyint(1) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `shingle` (`shingle`(255)) USING BTREE,
 KEY `count` (`id`),
 FULLTEXT KEY `shingle_fulltext` (`shingle`)
) ENGINE=InnoDB AUTO_INCREMENT=11707635 DEFAULT CHARSET=utf


Следующий запрос выполняется в районе 20с.
select `t1`.* from 
(select * from `shingles` 
where MATCH (shingle) AGAINST ('слово' IN BOOLEAN MODE)) as t2 
inner join `shingles` as `t1` on `t1`.`id` = `t2`.`id`
 order by `t1`.`count` desc limit 5


Чем больше результатов в полнотекстовом поиске, тем медленнее...
Как можно оптимизировать? Без "order by" все летает.
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 2
LaRN
@LaRN
Senior Developer
Можно попробовать без подзапроса, так не будет вложенного цикла по большой таблице:
SELECT t1.*, MATCH (t1.shingle) AGAINST ('слово' IN BOOLEAN MODE) AS ind
FROM shingles as t1
ORDER BY t1.ind DESC, t1.count DESC
LIMIT 5
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT * 
  FROM `shingles` 
  WHERE MATCH (`shingle`) AGAINST ('слово' IN BOOLEAN MODE)
  ORDER BY `count` DESC
  LIMIT 5
Ответ написан
Ваш ответ на вопрос

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

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