假设我有一个表A,从该表创建一个视图V.
然后我从V做了几个查询。我想知道每次查询时是否会重新构造V?或者它只会被构造一次,并被DBMS保存在内存中用于下一个查询(我认为类似于从表中查询)?
答案 0 :(得分:2)
一般来说,没有。 V是一组瞬态行,在查询请求时计算。因为在从视图查询时可以应用其他WHERE和ORDER BY条件,所以针对同一视图的两个查询的执行计划可能会完全不同。数据库通常不能对视图重用先前查询的结果,以满足针对该视图的下一个查询。
也就是说,在一些称为物化视图的引擎中有一种相对较新的技术。我自己从未使用它们,但我的理解是这些视图是根据对基础表进行的更新预先计算的。因此,使用Materialize Views可以提高SELECT性能,但代价是降低INSERT,UPDATE和DELETE性能。
您还应该知道,多列索引可用于预先计算某些选择并对涉及单个表的排序顺序进行排序。如果针对可以使用复合索引满足的表发出查询(查询只需要索引中的列,并且排序顺序与索引匹配),则表本身不需要读取,只读取索引。
答案 1 :(得分:1)
MySQL中的视图不是事实上的缓存解决方案。
每次查询这些基表上的视图时,MySQL都会对基表运行查询。查询的结果不会存储在视图中。
因此,无需像在Microsoft Microsoft SQL Server中使用实体化视图那样“刷新”视图。每次查询视图时,甚至会重新评估MySQL视图定义中的SQL。
如果您需要MySQL中的物化视图,可能有用的一个工具是FlexViews。这将查询结果存储在普通基表中,然后监视MySQL二进制日志中记录的更改,并将相关更改应用于基表。这个工具非常有用,但它有一些注意事项:
答案 2 :(得分:0)
根据Pinal Dave,a view must be refreshed in order to reflect changes made to its referenced table(s)。我不确定这会使一个简单的1表查询比直接查询表更有效(它可能没有),但我认为这意味着包含复杂连接和子查询的视图可能比非非查询效率更高 - 查看同行。
Pinal Dave对其他limitations of SQL views(或者你喜欢的功能)有更多话要说。也许你可以在那里学到一些有用的东西。
答案 3 :(得分:-1)
Mysql Views不支持索引。 (就像在Oracle中一样,您可以在Oracle Views中创建索引)但是当使用合并算法创建时,mysql视图可以使用基础表中的索引。
如果您必须使用视图,请调整您的JOIN BUFFER。
使用,像这样的东西
设置全局join_buffer_size = 314572800;
在更改缓冲区大小之前和之后分析差异。 我在增加连接缓冲区后看到,视图查询同时执行(以毫秒为单位),因为相同大小的表将执行。