Как мне оптимизировать этот полнотекстовый поисковый запрос? (цветок) (1,5 мил строки) - PullRequest
3 голосов
/ 30 ноября 2011

В настоящее время у меня есть полнотекстовый поисковый запрос в PostgreSQL (см. Ниже), который просматривает одну таблицу из 1,5 миллионов строк, чтобы найти все элементы, которые соответствуют терминам «Все», а также термину «Любой».

Запрос выполняется правильно и с посредственной скоростью (~ 2-3 секунды) для запросов, которые дают мало результатов. И на ужасных скоростях с результатами 100 000+ матчей (~ 15-100 сек)

Запрос сначала упорядочивает результаты по типу термина (все совпадают термины, а затем совпадают любые термины), а затем подопределяет результаты путем вычисления релевантности ts_rank_cd. (А также более простые варианты, где он упорядочен по уже известным столбцам, которые могут быть проиндексированы, например, длительность)

SELECT
  *,
  ts_rank_cd(textsearchable, query_any_terms) AS relevance,
  textsearchable @@ query_all_terms AS all_terms,
  sum(1) over (PARTITION BY textsearchable @@ query_all_terms) AS match_method_total,
  sum(1) over () AS all_matched_total
FROM
  videos,
  to_tsquery(?) AS query_any_terms,
  to_tsquery(?) AS query_all_terms
WHERE
  website IN (?)
  AND textsearchable @@ query_any_terms
  AND duration_in_seconds >= ?
  AND duration_in_seconds <= ?
ORDER BY
  all_terms DESC, 
  relevance DESC 
LIMIT ? 
OFFSET ?

Все соответствующие столбцы были проиндексированы, и системный мониторинг показывает, что память и процессор используются не в полной мере, а горлышком бутылки является дисковый ввод-вывод.

Сервер является сервером Ubuntu 10.04. Память и мощность процессора могут быть легко увеличены с помощью бэкэнда динамически по мере необходимости для решения.

В настоящее время база данных является статической, когда в рабочем состоянии и записи в базу данных не производятся на рабочем сервере. Поэтому можно полностью и точно создать индекс, который остается точным, если это выгодно.

Любая помощь в поиске любого пути улучшения будет принята с благодарностью. Дополнительная информация может быть предоставлена ​​своевременно по запросу.

1 Ответ

1 голос
/ 01 декабря 2011

Загрузил БД в оперативную память с помощью tmpfs, и время запроса значительно улучшилось (т. Е. Оно увеличилось с ~ 100 сиш до ~ 2 сиш).

см. http://www.slideshare.net/pgconf/five-steps-perform2009

...