一尘不染

MySQL视图如何工作?

mysql

创建视图时,我基本上是在创建一个新表,当其中一个表中的数据发生变化时,该表将自动进行处理。那是对的吗?

另外,为什么我不能在视图中使用子查询?


阅读 253

收藏
2020-05-17

共1个答案

一尘不染

视图的工作方式 类似于表 ,但不是表。它永远不存在;它只是在引用视图名称时运行的准备好的SQL语句。IE浏览器:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

…相当于运行:

SELECT x.* 
  FROM (SELECT * FROM bar) x

MySQLDump将永远不会包含要插入视图中的行…

另外,为什么我不能在视图中使用子查询????

遗憾的是,这是出于(尽管是有问题的)设计。MySQL视图有很多限制,已记录在案:http : //dev.mysql.com/doc/refman/5.0/en/create-
view.html

因此,如果只是假想的表/准备好的语句,是否就意味着它在理论上具有与普通表/查询相同的性能(甚至更低)?


不可以。一个表可以具有关联的索引,这可以使数据检索更快(在插入/更新时要付出一定的代价)。一些数据库支持“物化”视图,即可以对其应用索引的视图-
考虑到有限的视图功能(这只在v5 IIRC中开始,很晚才开始),MySQL 不支持就 不足为奇了)。

由于视图是派生表,因此视图的性能仅取决于其建立的查询。如果该查询很烂,性能问题将只是滚雪球……也就是说,在查询视图时-
如果WHERE子句中的视图列引用未包装在函数中(IE :WHERE v.column LIKE ...不是 WHERE LOWER(t.column) LIKE ...),则优化器可能会推入条件(称为谓词)添加到原始查询中-使其速度更快。

2020-05-17