1

(これは最適化とパフォーマンスに関する質問です。ここで基礎を固めたいと思います。最後に私の質問です。)

地域に存在するビデオに関するポリシー データを返す RESTful API を Ruby on Rails でコーディングしています。ポリシーの例としては、「Video #1 : ShowWithAds in US」または「Video #2 : Block in MX」などがあります。

2 つのビューのデータを返す必要があります。

  1. "Show all videos for US with Block " は、米国でブロックされた各動画のポリシーのリストを返します。
  2. 「MX のビデオ#1のポリシーを表示」は、MXのビデオ #1 のポリシーを返します。例: 「ShowAds

私のテーブルは次のようになります。

ビデオ

  • ビデオ ID (文字列)
  • 題名

VideoPolicy (ビデオとポリシーの JOIN テーブルとして機能)

  • VideoID (FK から Video、文字列)
  • 国 (文字列)
  • PolicyID (ポリシーへの外部キー、int)

['VideoID/Country' および 'Country/PolicyID' のインデックス]

ポリシー

  • ポリシー ID (int)
  • 名前 (文字列)

したがって、上記の各ビューの DB クエリは次のようになります。

  1. 「国 = US AND ポリシー ID = 1 の VideoPolicy から選択」
  2. "国 = US AND VideoID = 2 の VideoPolicy から選択"

全体的に非常に単純なテーブル/クエリ。このシステムの規模が拡大し始めると、任意に 500,000 本の動画があり、それぞれに 200 か国のポリシーが適用されているとします。つまり、Videoテーブルは500,000 行になり、VideoPolicyテーブルは (500,000 * 200 =) 1 億行になり、Policyテーブルはわずか4行になります。行

ここから私の質問が始まります。

  1. 主キーがありませんが、その JOIN テーブルVideoPolicyに適切なインデックスがあると仮定すると、上記のクエリは引き続き効率的に実行されますか?
  2. もしそうなら、私はDBの終わりに十分満足しています. ただし、Web アプリケーションとして、ポリシーのために毎回 DB をヒットするのは望ましくないため、キャッシュを実装したいと考えています。これら 2 つのビュー/クエリを満たすには、キャッシュにどのようなキーを使用する必要がありますか (ペイロードがVideoPolicyであると仮定)。
  3. ここで利用できる Rails マジックはありますか?
  4. 他に潜在的なパフォーマンスのボトルネックがありませんか?

どんな提案でも大歓迎です!

4

1 に答える 1