在MySQL中使用视图的优势

在MySQL中使用视图的优势,mysql,stored-procedures,views,Mysql,Stored Procedures,Views,我了解到,视图可以用于创建自定义表视图,也就是说,可以从多个表聚合相关数据 我的问题是:观点的好处是什么?具体来说,假设我有两张表: event | eid, typeid, name eventtype | typeid, max_team_members 现在我创建一个视图: eventdetails | event.eid, event.name, eventtype.max_team_members | where event.typeid=eventtyp

我了解到,视图可以用于创建自定义表视图,也就是说,可以从多个表聚合相关数据

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

event | eid, typeid, name
eventtype | typeid, max_team_members
现在我创建一个视图:

eventdetails | event.eid, event.name, eventtype.max_team_members 
             | where event.typeid=eventtype.typeid
现在,如果我想确定某项活动允许团队成员的最大数量,我可以:

使用视图 执行联接查询或存储过程。 每种方法的优点/缺点是什么


另一个查询:如果更新了表events和EventType中的数据,则更新视图中的数据时是否会涉及任何开销,因为它会缓存结果数据?

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

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

除了前面指出的安全功能外:

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

它还允许您更改将来在一个位置执行联接的方式。也许一对多关系可以变成多对多关系,在连接中引入一个额外的表。或者,您可以决定取消规范化并在每个事件记录中包含所有eventtype字段,这样您就不必为查询执行时间加入每个时间交易空间

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


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

视图不是单独存储的-因此mysql不会对视图内容执行缓存?其他一些数据库引擎支持在显示结果时使用物化视图从视图中进行选择的数据被缓存,但MySQL没有。请参见此处关于物化视图的注释:MySQL确实有一个查询缓存,因此如果您的查询完全相同,例如,从myview中选择*;,你很可能会得到缓存的结果。事实上,它们有时会比较慢。原因是,当您使用某些类型的视图时,中间表是在没有索引的情况下构建的,这会导致外部SELECT语句运行较慢。阅读有关