У меня есть таблица медицинских диагностических кодов, с помощью которых пользователи могут выполнять поиск по ключевым словам. У меня есть столбец описательного текста, а также столбец синонимов, оба из которых рассматриваются. Результаты представлены в формате автоматического предложить и текущая реализация запроса является слишком медленной для развертывания:Оптимизация полнотекстового запроса MySQL
SELECT
ID AS data, CONCAT('[', ICD10, '] ', description) AS value,
MAX(MATCH(description) AGAINST("fracture forearm current init oth" IN BOOLEAN MODE) +
(MATCH(synonyms) AGAINST("fracture forearm current init oth" IN BOOLEAN MODE) * 0.5)) AS relevance
FROM Code
WHERE
(MATCH(description) AGAINST("fracture forearm current init oth" IN BOOLEAN MODE) OR
MATCH(synonyms) AGAINST ("fracture forearm current init oth" IN BOOLEAN MODE)) AND
isPCS = 0 AND
isEnabled = 1 AND
ICD10 IS NOT NULL AND
description IS NOT NULL
GROUP BY ID
ORDER BY relevance DESC
LIMIT 100
Есть ~ 170K строк в таблице, хотя последние четыре статических ограничений уменьшить его до ~ 94K строка , из которых ~ 16K имеют синонимы. Типичный запрос занимает 0,45 секунды на моем рабочем столе (i7-4770K) и около 0,75 секунды на нашем сервере разработки (нижний конец Xeon). Удаление ключевого слова ORDER BY
уменьшает его до 0,02 и 0,05 секунд, соответственно.
Я ожидал, что сортировка результатов будет тривиальной по сравнению с полнотекстовым поиском, но это, похоже, не так. Мне не хватает вопиющей неэффективности?
Я также изучаю, в конце концов, восстановление этой функциональности поверх Lucene/Solr (приветствовались мнения/предложения), но я хотел бы лучше понять это поведение, и оптимизированное временное решение не повредит или.
Я понял, что 'LIMIT' не сохраняет никаких ресурсов при сортировке, но не то, что я мог бы сделать совместный индекс так легко. Это делает его прочным до <0,07 секунды в каждом тестовом случае. Благодаря! –