Как оптимизировать поиск полнотекстового объединения MySQL? - PullRequest
2 голосов
/ 19 апреля 2011

Я выполняю полнотекстовый поиск MySQL.

моя таблица базы данных article1 содержит ~18000 статей, article2 имеет ~7000 статей, article3 имеет ~13000 статейFIELD cat - это поле INDEX

Теперь я хочу выполнить поиск объединений.Есть 5 групп слов, помещенных в 3 таблицы, сопоставьте результаты.Но время процесса составляет 3.1213495136 seconds.(Я добавляю microtime(), чтобы посмотреть, сколько это будет стоить).Есть ли способ оптимизировать поиск полнотекстового объединения MySQL?Благодарю.

(SELECT title,content,date FROM article1 WHERE 
(cat='novel' AND MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(cat='novel' AND MATCH (title,content) AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE)))
UNION 
(SELECT title,content,date FROM article2 WHERE 
(MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content)AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE)))
UNION 
(SELECT title,content,date FROM article3 WHERE 
(MATCH (title,content) AGAINST ('+Mary +Barnard' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Patricia +Beer' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Aphra +Behn' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content) AGAINST ('+Judy +Blume' IN BOOLEAN MODE)) 
OR 
(MATCH (title,content)AGAINST ('+Elizabeth +Bowen' IN BOOLEAN MODE)))
Order By date DESC LIMIT 10

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

Первое, что вы должны сделать, это добавить

Order By date DESC LIMIT 10 

в каждый подзапрос, так как вам не нужно больше 10 результатов в конце.

Во всех таблицах также должны быть индексы для полей "дата".

alter table "TABLENAME" add index date_idx(date);

ДОПОЛНИТЕЛЬНО:

Вы можете сократить и немного ускорить запрос, изменив условия поиска в форме: "() | ()"

(SELECT title,content,date FROM article1 WHERE 
(cat='novel' AND MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10)
UNION 
(SELECT title,content,date FROM article2 WHERE 
(MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10)
UNION 
(SELECT title,content,date FROM article3 WHERE 
(MATCH (title,content) AGAINST ('(+Mary +Barnard) | (+Patricia +Beer) | (+Aphra +Behn) | (+Judy +Blume) | (+Elizabeth +Bowen)' IN BOOLEAN MODE)) 
Order By date DESC LIMIT 10)
Order By date DESC LIMIT 10
1 голос
/ 22 апреля 2011

Альтернативой вашему союзу было бы проводить их как отдельные поиски.Если вы упорядочиваете свои критерии по релевантности, первый набор - ваш лучший;возвращать частичные результаты и только если их меньше 10, попробуйте следующее совпадение и т. д.

Тогда запрос выполняется для конечного пользователя быстро, возвращает результаты в порядке релевантности и не тратит ресурсы MySQL на ненужныеданные.Если пользователь запрашивает больше, может выполняться более длинный, неэффективный запрос, но он имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...