(这是一个关于优化和性能的问题,我想在这里打基础,那么最后是我的问题。)
我在 Ruby on Rails 中编写了一个 RESTful API,它返回有关某个区域中存在的视频的策略数据。示例策略可能是“视频#1:美国的ShowWithAds ”或“视频#2:MX中的屏蔽”。
我需要为两个视图返回数据:
- “显示美国的所有视频并阻止”返回每个在美国被阻止的视频的政策列表。
- “在 MX 中显示视频# 1的策略”返回MX中视频 #1 的策略。即“ ShowAds ”
这是我的表的样子:
视频
- 视频ID(字符串)
- 标题
VideoPolicy(充当视频和策略的 JOIN 表)
- VideoID(FK 到视频,字符串)
- 国家(字符串)
- PolicyID(FK 到 Policy,int)
['VideoID/Country' 和 'Country/PolicyID' 的索引]
政策
- 政策 ID(整数)
- 名称(字符串)
因此,上述每个视图的数据库查询如下所示:
- “从国家 = US AND PolicyID = 1 的 VideoPolicy 中选择”
- “从国家 = US AND VideoID = 2 的 VideoPolicy 中选择”
总体上非常简单的表/查询。当这个系统开始规模化时,假设我有 500,000 个视频,每个视频都有 200 个国家/地区的政策,这意味着Video表变为500,000 行,VideoPolicy表变为 (500,000 * 200 =) 1 亿行,而Policy表只有4行。
这是我的问题开始的地方。
- 尽管它缺少主键,但假设我在该 JOIN 表VideoPolicy上有正确的索引,我上面的查询是否仍能有效运行?
- 如果是这样,我对 DB 端很满意。但是,作为一个 Web 应用程序,我不想每次都访问数据库以获取策略,所以我想实现缓存。为了满足这两个视图/查询,我应该为我的缓存使用什么样的键(假设有效负载是VideoPolicy )?
- 我可以在这里利用任何 Rails 魔法吗?
- 我是否遗漏了任何其他潜在的性能瓶颈?
任何建议都非常感谢!