(これは最適化とパフォーマンスに関する質問です。ここで基礎を固めたいと思います。最後に私の質問です。)
地域に存在するビデオに関するポリシー データを返す RESTful API を Ruby on Rails でコーディングしています。ポリシーの例としては、「Video #1 : ShowWithAds in US」または「Video #2 : Block in MX」などがあります。
2 つのビューのデータを返す必要があります。
- "Show all videos for US with Block " は、米国でブロックされた各動画のポリシーのリストを返します。
- 「MX のビデオ#1のポリシーを表示」は、MXのビデオ #1 のポリシーを返します。例: 「ShowAds」
私のテーブルは次のようになります。
ビデオ
- ビデオ ID (文字列)
- 題名
VideoPolicy (ビデオとポリシーの JOIN テーブルとして機能)
- VideoID (FK から Video、文字列)
- 国 (文字列)
- PolicyID (ポリシーへの外部キー、int)
['VideoID/Country' および 'Country/PolicyID' のインデックス]
ポリシー
- ポリシー ID (int)
- 名前 (文字列)
したがって、上記の各ビューの DB クエリは次のようになります。
- 「国 = US AND ポリシー ID = 1 の VideoPolicy から選択」
- "国 = US AND VideoID = 2 の VideoPolicy から選択"
全体的に非常に単純なテーブル/クエリ。このシステムの規模が拡大し始めると、任意に 500,000 本の動画があり、それぞれに 200 か国のポリシーが適用されているとします。つまり、Videoテーブルは500,000 行になり、VideoPolicyテーブルは (500,000 * 200 =) 1 億行になり、Policyテーブルはわずか4行になります。行。
ここから私の質問が始まります。
- 主キーがありませんが、その JOIN テーブルVideoPolicyに適切なインデックスがあると仮定すると、上記のクエリは引き続き効率的に実行されますか?
- もしそうなら、私はDBの終わりに十分満足しています. ただし、Web アプリケーションとして、ポリシーのために毎回 DB をヒットするのは望ましくないため、キャッシュを実装したいと考えています。これら 2 つのビュー/クエリを満たすには、キャッシュにどのようなキーを使用する必要がありますか (ペイロードがVideoPolicyであると仮定)。
- ここで利用できる Rails マジックはありますか?
- 他に潜在的なパフォーマンスのボトルネックがありませんか?
どんな提案でも大歓迎です!