1

(这是一个关于优化和性能的问题,我想在这里打基础,那么最后是我的问题。)

我在 Ruby on Rails 中编写了一个 RESTful API,它返回有关某个区域中存在的视频的策略数据。示例策略可能是“视频#1美国ShowWithAds ”或“视频#2MX中的屏蔽”。

我需要为两个视图返回数据:

  1. “显示美国的所有视频并阻止”返回每个在美国被阻止的视频的政策列表。
  2. “在 MX 中显示视频# 1的策略”返回MX中视频 #1 的策略。即“ ShowAds

这是我的表的样子:

视频

  • 视频ID(字符串)
  • 标题

VideoPolicy(充当视频和策略的 JOIN 表)

  • VideoID(FK 到视频,字符串)
  • 国家(字符串)
  • PolicyID(FK 到 Policy,int)

['VideoID/Country' 和 'Country/PolicyID' 的索引]

政策

  • 政策 ID(整数)
  • 名称(字符串)

因此,上述每个视图的数据库查询如下所示:

  1. “从国家 = US AND PolicyID = 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 应用程序,我不想每次都访问数据库以获取策略,所以我想实现缓存。为了满足这两个视图/查询,我应该为我的缓存使用什么样的键(假设有效负载是VideoPolicy )?
  3. 我可以在这里利用任何 Rails 魔法吗?
  4. 我是否遗漏了任何其他潜在的性能瓶颈?

任何建议都非常感谢!

4

1 回答 1

0

我认为 (country, video_id) 和 (country, policy_id) 上的复合索引可以解决问题,这对您的设备来说是一个简单的操作。您真的需要在这里缓存吗 - 不确定,如果数据库性能受到影响,您可以按国家/地区分片您的数据。

缓存怎么样——你可以缓存具体的页面(比如使用视图缓存)

于 2014-04-09T12:27:22.887 回答