1

私は、Postgresデータベースとuserssのテーブルを持っていて、columnss UserIdとTagIdを持っています。各ユーザーは複数のタグを持つことができ、その逆もあります。複数のタグでデータベース検索を実装するスケーラブルな方法はありますか?

複数のタグによる検索をスケーラブルに実装する方法はありますか?照会の例:

  • 取得TAG1とTAG2の両方を持っているすべてのユーザー
  • すべて持っているユーザー(TAG1またはTAG2)とTAG3を取得
  • 取得TAG1とTAG2を持っているとTAG3を持っていないすべてのユーザー

これはインデックスとスケールが容易ではないため、高速な検索のために、ある種のメモリ内キャッシュを使用することを考えていました。あなたはこの問題のすぐに利用できる解決法を知っていますか?すべての

+1

あなたは何人のユーザーとタグを持っていますか? Postgresはこれらのクエリを簡単に処理できるはずです(たとえば、tag1を持つすべてのユーザーと、tag2を持つすべてのユーザーが交差するように選択する)。メモリに適切なインデックスを持っていればかなり速くなりますが、postgresにはすでにメモリ内キャッシュとクエリの最適化があります。しかし、これがあなたのために役立たないならば、あなたはSolrまたはElasticを見ることができます。 – nvartolomei

答えて

1

まず

おかげで、多くの詳細を知らなくても、私は列TagIdsのカーディナリティが低い可能タグの数が、それほど多くはないが、そこにあると仮定します。私の答えはこの前提に基づいています。

一般に、低カーディナリティ列のインデックスは、この列のクエリのスケールアップに役立ちません。詳細は、Why low cardinality indexes negatively impact performanceを参照してください。

第2に、このセットの他のクエリが論理和形式(つまり、WHERE条件にORブール述語を含む)である可能性があることを明確に示しています。結合の数が多い場合は、パフォーマンスを救済してください。 DBMSは、(a)テーブル全体をスキャンし、各行をWHERE条件でテストし、(b)カラムTagIds上のインデックスをスキャンすることを検討する。

メモリの利用は、データがメモリに格納されているという事実に基づいています。しかし、原則として、インメモリDBMSは(a)と(b)を考慮し、おそらく(a)を(b)よりも選択します。

ここに記載されているfunction indexをPostgreSQLで使用することを提案します。アドホッククエリを処理していない場合は、考慮してください:

関連する問題