現在、PostgreSQLに全文検索クエリ(以下を参照)があり、150万行の単一のテーブルをスキャンして、「すべて」の用語と「任意」の用語に一致するすべてのアイテムを検索します。
結果がほとんどないクエリでは、クエリは正しく実行され、平凡な速度(〜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 ?
関連するすべての列にインデックスが付けられており、システムモニタリングにより、メモリとCPUが最大限に活用されておらず、ボトルネックがディスクIOであることがわかります。
サーバーはUbuntuServer10.04です。ソリューションを満たすために必要に応じて、バックエンドを介してメモリとCPUパワーを動的に簡単に増やすことができます。
現在、データベースは本番環境では静的であり、データベースへの書き込みは本番サーバーでは行われません。したがって、それが有益である場合、正確なままのインデックスを完全かつ正確に生成することが可能です。
改善の道を見つけるための助けをいただければ幸いです。追加情報は、リクエストに応じてタイムリーに提供できます。