MySQL view 的介绍与应用

在这周和 Vincent 讨论食物数据库的重构的方案的时候,Vincent 说到现在的数据库层面有很多地方用到视 图来做 mapping,当时听的似懂非懂的。尤其是对视图这个东西没有一点概念,当时甚至在想这视图难道是 Rails 中的视图。后来 Vincent 给我做了一个视图的简单的使用的演示,然我对这个东西有了一个初步的认 识,趁着周末又查了一些资料,对视图的概念与使用有了更多的认识,在这里和大家分享一下。

什么是视图?

MySQL 5.0 版本之后开始引入视图。视图本身是一个虚拟表,不存放任何数据。在使用 SQL 语句访问视图 的时候,它返回的数据是 MySQL 从其他表中生成的。视图和表是在同一个命名空间,MySQL 在很多地方对 于视图和表是同样对待的。不过视图和表也有不同,例如,不能对视图创建触发器,也不能用 DROP TABLE 命令删除视图。

关于视图的更多介绍以及详细使用,可意参考 MySQL 的官方手册, 我们主要来说一下使用视图提供的便利。

视图对于性能的影响

多数人认为视图不能提升性能,实际上,在 MySQL 中某些情况下视图也可以帮助提升性能,而且视图还可以和其他 提升性能的方式叠加使用。例如,在重构 schema 的时候可意使用视图,使得在修改视图底层表结构的时候,应用 代码还可能继续不报错的运行。

还可以使用视图实现基于列的权限控制,却不需要真正的在系统中创建列权限,因此没有额外的开销。

视图的限制

  • MySQL 不支持在视图中创建索引
  • MySQL 不支持物化视图 (指讲视图结果数据存放在一个可以查看的表中,并定期从原始表中刷新数据到这个表中)
  • MySQL 并不会保存视图定义的原始 SQL 语句,所以如果打算通过执行 SHOW CREATE VIEW 后再简单地 修改其结果的方式来重新定义视图是不行的

参考: 《高性能 MySQL》