2012-04-15 3 views
1

Я использую этот запрос, но, к сожалению, она работает медленно:полнотекстовые: этот запрос очень медленно

SELECT *, 
    (MATCH(`title`) AGAINST ('$word' IN BOOLEAN MODE) * 2 
    + MATCH(`content`) AGAINST ('$word' IN BOOLEAN MODE) * 2 
    + MATCH(`url`) AGAINST ('$word' IN BOOLEAN MODE) * 1.1 
    + MATCH(`desc`) AGAINST ('$word' IN BOOLEAN MODE) * 1.2) * `like` 
    AS score 
FROM `data` 
WHERE MATCH(`content`,`desc`,`title`,`url`) AGAINST ('$word' IN BOOLEAN MODE) 
ORDER BY `score` DESC LIMIT 1000 

результат базы данных 15000. это означает, что 15000 записей будут сделали, но это занимает около 25sec времени запрос. Я использую PDO.

+2

Как насчет специализированных полнотекстовых поисковых систем? Сфинкс, например. –

+2

Правильно отформатируйте запрос. Существует длинный горизонтальный свиток. – Lion

+0

Просьба представить структуру таблицы особенно с индексами, битва SELECT * никогда не является хорошей идеей! – worenga

ответ

0

Вам понадобятся индексы FULLTEXT, в противном случае СУБД необходимо будет искать всю таблицу каждый раз. Это замедляет вставку записей. Обратите внимание, что полнотекстовый поиск по 4 столбцам всегда относительно медленный.

CREATE FULLTEXT INDEX indexTitle ON `data` (title) 
CREATE FULLTEXT INDEX indexContent ON `data` (content) 
CREATE FULLTEXT INDEX indexURL ON `data` (url) 
CREATE FULLTEXT INDEX indexDesc ON `data` (desc) 
CREATE FULLTEXT INDEX combinedIndex ON `data` (content, desc, title, url) 
Смежные вопросы