一个视图的定义中可以引用的最大表数为61。
视图处理未优化:
无法在视图上创建索引。
索引可用于使用合并算法处理的视图。但是,使用临时表算法处理的视图无法利用其基础表上的索引(尽管可以在生成临时表时使用索引)。
有一个一般原则,即您不能修改表并不能从子查询的同一表中选择。请参见 第13.2.11.12节“对子查询的限制”。
如果从从表中选择的视图中进行选择,如果该视图从子查询中的表中进行选择,并且该视图是使用合并算法进行评估的,则同样的原理也适用。例:
CREATE VIEW v1 AS
SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a);
UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;
如果视图是使用临时表评估的,则 可以从视图子查询的表中进行选择,然后仍然在外部查询中修改该表。在这种情况下,视图将被存储在一个临时表,因此你是不是真的从表中的子查询中选择并修改它 “ 在同一时间。”(这是您可能希望通过ALGORITHM = TEMPTABLE在视图定义中指定来强制MySQL使用临时表算法的另一个原因 。)
您可以使用DROP TABLE或 ALTER TABLE删除或更改视图定义中使用的表。DROP或ALTER操作不会产生警告,即使这会使视图无效。而是,当使用视图时,稍后会发生错误。CHECK TABLE可用于检查已被DROP或ALTER 操作无效的视图。
关于视图的可更新性,视图的总体目标是,如果任何视图在理论上都是可更新的,则在实践中应该是可更新的。MySQL尽快。现在,可以从理论上更新许多理论上可更新的视图,但是仍然存在局限性。有关详细信息,请参见第24.5.3节“可更新和可插入视图”。
当前视图的实现存在一个缺点。如果授予用户创建视图所需的基本特权(CREATE VIEW和 SELECT特权),SHOW CREATE VIEW 除非该用户也被授予SHOW VIEW特权,否则该用户将无法调用该对象 。
该缺点可能导致使用mysqldump备份数据库时出现问题,由于权限不足,该数据库 可能会失败。错误#22062中描述了此问题。
该问题的解决方法是管理员手动将SHOW VIEW特权授予被授予的用户CREATE VIEW,因为MySQL在创建视图时不会隐式授予它。
视图没有索引,因此索引提示不适用。从视图中选择时不允许使用索引提示。
SHOW CREATE VIEW使用每列的子句显示视图定义。如果从表达式创建列,则默认别名为表达式文本,该文本可能会很长。 将对照最大列长度64个字符(而不是最大别名长度256个字符)检查语句中列名的别名。结果,如果任何列别名超过64个字符,则从fail 输出创建的视图将失败。在以下情况下,别名过长的视图可能会导致问题: AS alias_nameCREATE VIEWSHOW CREATE VIEW
视图定义无法复制到强制列长度限制的较新的从属服务器。
用mysqldump创建的转储文件不能被加载到执行列长限制的服务器中。
任一问题的解决方法是修改每个有问题的视图定义,以使用提供较短列名的别名。然后,该视图将正确复制,并且可以转储和重新加载而不会引起错误。要修改定义,请使用DROP VIEW和再次放置并创建视图CREATE VIEW,或用替换定义 CREATE OR REPLACE VIEW。
对于在转储文件中重新加载视图定义时发生的问题,另一个解决方法是编辑转储文件以修改其 CREATE VIEW语句。但是,这不会更改原始视图定义,这可能会导致后续转储操作出现问题。