在MySQL中使用视图的优点

jrh*_*ath 22 mysql stored-procedures views

我已经了解到,可以使用视图创建自定义"表视图"(也就是说)来聚合来自多个表的相关数据.

我的问题是:观点的优点是什么?具体来说,假设我有两个表:

event | eid, typeid, name
eventtype | typeid, max_team_members
Run Code Online (Sandbox Code Playgroud)

现在我创建一个视图:

eventdetails | event.eid, event.name, eventtype.max_team_members 
             | where event.typeid=eventtype.typeid
Run Code Online (Sandbox Code Playgroud)

现在,如果我想让一些团队允许的最大成员数量event,我可以:

  • 使用视图
  • 进行连接查询(或者可能是存储过程).

每种方法的优点/缺点是什么?

另一个问题是:如果表事件和事件类型中的数据得到更新,是否有任何开销涉及更新视图中的数据(考虑到它缓存结果数据)?

Har*_*d L 19

视图不会单独存储:查询视图时,视图将替换为该视图的定义.因此,表格中的数据更改将立即通过视图显示.

除了之前指出的安全功能:

如果您正在编写大量将执行该连接的查询,则会将该SQL代码计算出来.就像在多个地方使用的函数中执行某些操作一样,它可以使您的代码更容易读/写/调试.

它还允许您在一个地方更改将来执行连接的方式.也许1对多关系可能会成为多对多关系,在连接中引入额外的表.或者您可以决定非规范化并在每个事件记录中包含所有eventtype字段,这样您就不必每次都加入(交易空间用于查询执行时间).

您可以稍后进一步拆分表,将其更改为3向连接,并且不必重写使用该视图的其他查询.

您可以向表中添加新列并更改视图以省略新列,以便在更改表定义时使用"select*"的某些旧查询不会中断.

  • 其他一些数据库引擎支持"物化视图",其中从视图中选择的结果被缓存,但MySQL没有.请在此处查看有关物化视图的评论:http://dev.mysql.com/doc/refman/5.5/en/create-view.html (2认同)
  • MySQL确实有一个查询缓存,所以如果你的查询完全相同(例如,"select*from myview;"),你可能会获得缓存结果. (2认同)
  • 事实上,它们有时会变慢.原因是当你使用某些类型的视图时,中间表是在没有索引的情况下构建的,这会导致外部`SELECT`语句运行得更慢.阅读[`TEMPTABLE`算法](http://dev.mysql.com/doc/refman/5.0/en/view-algorithms.html) (2认同)

Ign*_*ams 13

您可以将用户限制为视图而不是基础表,从而增强安全性.