视图VS表格对于“facebook”,如Feed

时间:2010-08-07 15:19:49

标签: sql mysql views query-optimization

我目前正在设计一个功能类似于facebook Feed的仪表板Feed。 Feed将包含以下内容:

  • 通知新用户的用户
  • 显示发送给用户的推介,已收到推介
  • 管理员新闻
  • Up uping events。

上面的每一个都存储在它自己的表中,但在Feed页面上,它们应该全部混合在一起。那没关系,所以我想到的第一件事就是桌子。使用表格,它更容易调试,允许我保留历史数据,如果我需要使用if用于其他目的,例如,如果我们为用户提供粘贴通知的能力,则很容易更改。

所以我和我的经理一起讨论了我的解决方案,他说使用视图可能会更好,因为SELECT占用的资源比典型的删除和插入少得多。我同意他的意见,因为在每个页面加载开始时,我必须对表进行清理,删除未使用的记录,删除不再有效的项目,并重新填充更新的数据。现在,如果他们不断刷新,那么就没有工作可做,因此性能上升也不错,但如果1000个用户同时访问该网站,如果填充了一个表,可能会有巨大的性能损失所有这些用户。

我想我对使用视图的唯一顾虑是,我是历史数据的傻瓜,而后来如果用户想要自定义视图,它会更容易;但是在这一点上没有提到这一点,所以表现是目前唯一的问题。

以下是通知需要做的事情:

  1. 显示多个表格中的最新信息
  2. 这些项目必须按日期输入系统进行混合和排序
  3. 其中一些将是粘性的,有些不会基于管理员决定的(这些将暂时静态设置)
  4. 从列表中删除项目的功能
  5. 每个用户都有自己的区域来展示自己的项目。
  6. 将始终为新用户显示的项目。例如,如果在用户首次登录时需要显示欢迎消息
  7. 如果通知超过100,请在100之后删除所有通知,即使通知低于100也不会显示通知
  8. 这是我的两张桌子,帮助我完成这项任务:

    通知
    - id
    - user_id(如果为null,则所有用户都可以查看此项目)
    - table_pk(此链接到的表的主要ID) - 表格(此行链接到的表格)
    - 粘性(粘性物品)
    - date_added(添加日期)

    notifications_removed
    - id
    - notification_id
    - user_id

    现在我有一个刷新该表的刷新功能,但我的经理想到的是我们摆脱了通知表并将其转化为视图。这样做会有好处吗?如上所述,每次都会刷新这些项目,因此性能受到影响的是我的方式必须对通知表进行表清理,而视图只是选择并将事物连接在一起。另一方面,我看到的唯一不利的一面是,我将失去通知的灵活性和历史,现在这不是一件大事。

1 个答案:

答案 0 :(得分:0)

非物化视图(MySQL不支持物化视图)与准备好的SELECT语句没什么区别 - 您可以并排运行两个并且性能相同。应用于视图的简单WHERE子句(谓词)可以推送到内部查询中,但这意味着没有数据操作(IE:列上的函数,聚合函数等)。

使用正在汇总的数据视图替换通知将减轻对表的更新,使系统更“实时”。您是否需要方便的历史数据?您可以从备份中恢复它(虽然通过大量备份重建数据很麻烦),或者您可以在数据中添加一个标志,这样就不会从表中删除已删除的数据 - 该标志只是控制可见性(但是这个意味着持有更多数据)。

以前

如果您在其他问题中提供了有关情况的更多详细信息,我们可以帮助您进行优化。通常,您可以在可能的情况下缓存数据,因为数据库跳闸很昂贵,但这是决定何时刷新缓存的平衡行为。