MySQL视图如何工作?

Joh*_*all 39 mysql sql sql-view

当我创建一个视图时,我基本上创建了一个新表,当它加入的一个表中的数据发生变化时,它将自动被处理; 那是对的吗?

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

OMG*_*ies 52

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

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo
Run Code Online (Sandbox Code Playgroud)

......相当于运行:

SELECT x.* 
  FROM (SELECT * FROM bar) x
Run Code Online (Sandbox Code Playgroud)

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 ...),优化器可能会推送标准(称为谓词)到原始查询上 - 使其更快.

  • @Slokun:MySQL视图不能使用子查询 - 在典型的SQL语句中子查询很好. (5认同)
  • 不知道MySQL无法执行子查询。 (2认同)