缓存多维数据?

时间:2013-03-08 19:48:17

标签: sql ruby-on-rails caching

(这是一个关于优化和性能的问题,我想在这里开展工作,最后是我的问题。)

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

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

  1. “显示美国的所有视频阻止”会返回已在美国屏蔽的每个视频的政策列表。
  2. “在 MX 中显示视频#1 的政策”会返回MX中视频#1的政策。即“ ShowAds
  3. 这是我的表格的样子:

    视频

    • VideoID(字符串)
    • 标题

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

    • VideoID(FK to Video,string)
    • 国家(字符串)
    • PolicyID(FK to Policy,int)

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

    政策

    • PolicyID(int)
    • 姓名(字符串)

    所以上面每个视图的数据库查询都是这样的:

    1. “从VideoPolicy中选择Country = US AND PolicyID = 1”
    2. “从VideoPolicy中选择Country = US AND VideoID = 2”
    3. 整体上非常简单的表/查询。当这个系统开始扩展时,任意说我有500,000个视频,每个视频都有200个国家的政策,这意味着视频表变为 500,000行 VideoPolicy 表变为(500,000 * 200 =) 1亿行策略表只是 4行

      以下是我的问题所在。

      1. 虽然它没有主键,但假设我在JOIN表 VideoPolicy 上有适当的索引,我上面的查询是否仍能高效运行?
      2. 如果是这样,我对DB结束感到高兴。但是,作为一个Web应用程序,我不想每次都为策略命中DB,所以我想实现缓存。我应该为缓存使用什么样的密钥(假设有效负载是 VideoPolicy ),以满足这两个视图/查询?
      3. 我可以利用这里的Rails魔法吗?
      4. 我是否错过任何其他潜在的性能瓶颈?
      5. 非常感谢任何建议!

1 个答案:

答案 0 :(得分:0)

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

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