Mysql 从数据库中的视图进行查询比从表进行查询更有效吗?

Mysql 从数据库中的视图进行查询比从表进行查询更有效吗?,mysql,database,view,Mysql,Database,View,假设我有一个表a,从该表创建一个视图V 然后我对V进行了几次查询。我想知道每次查询时是否会重新构造V?或者只构造一次,然后由DBMS保存在内存中的某个位置,以便下次查询(我认为这类似于从表中查询)根据Pinal Dave的说法。我不确定这是否会使简单的单表查询视图比直接查询表更高效(可能不会),但我认为这意味着包含复杂联接和子查询的视图可能比其非视图对应视图更高效 皮纳尔·戴夫(Pinal Dave)对其他(或功能,如果你喜欢的话)还有更多的话要说。也许你可以在那里学到一些有用的东西。Mysql

假设我有一个表a,从该表创建一个视图V

然后我对V进行了几次查询。我想知道每次查询时是否会重新构造V?或者只构造一次,然后由DBMS保存在内存中的某个位置,以便下次查询(我认为这类似于从表中查询)

根据Pinal Dave的说法。我不确定这是否会使简单的单表查询视图比直接查询表更高效(可能不会),但我认为这意味着包含复杂联接和子查询的视图可能比其非视图对应视图更高效


皮纳尔·戴夫(Pinal Dave)对其他(或功能,如果你喜欢的话)还有更多的话要说。也许你可以在那里学到一些有用的东西。

Mysql视图不支持索引。(就像在Oracle中一样,您可以在Oracle视图中创建索引),但mysql视图在使用合并算法创建时可以使用基础表中的索引

如果必须使用视图,请调整联接缓冲区

用,像这样的东西

设置全局连接缓冲区大小=314572800

在更改缓冲区大小之前和之后,请确定差异。
我已经看到,在增加联接缓冲区后,视图查询的执行时间(毫秒)与相同大小的表相同。

一般来说,no.V是一组临时行,在查询请求时计算。因为在从一个视图进行查询时可以应用额外的WHERE和ORDER-BY条件,所以针对同一个视图的两个查询的执行计划可能会有很大的不同。数据库通常不能重用对某个视图的上一个查询的结果来满足对该视图的下一个查询

也就是说,在一些引擎中有一种相对较新的技术,称为物化视图。我本人从未使用过它们,但我的理解是,这些视图是基于对底层表的更新而预先计算的。因此,使用物化视图确实可以提高选择性能,但代价是降低插入、更新和删除性能


您还应该知道,多列索引可用于预计算涉及单个表的某些选择和排序顺序。如果使用复合索引(查询只需要索引中的列,并且排序顺序与索引匹配)对表发出查询,则不需要读取表本身,只需要读取索引。

MySQL中的视图不是事实上的缓存解决方案

每次查询基表上的视图时,MySQL都会对这些基表运行查询。不会为视图存储查询结果

因此,不需要像在Oracle Microsoft SQL Server中使用物化视图那样“刷新”视图。即使是MySQL视图定义中的SQL也会在每次查询视图时重新计算

如果您需要MySQL中的物化视图之类的东西,一个可能有用的工具是。这将查询结果存储在普通的基表中,然后监视MySQL二进制日志中记录的更改,并将相关更改应用于基表。此工具可能非常有用,但有一些注意事项:

  • FlexView是用PHP编写的,因此它有一些性能限制。根据您的写入流量负载,FlexView可能无法跟上
  • 它不支持所有可能的SELECT查询类型
  • FlexView管理的物化视图表不可更新。也就是说,您可以更新此视图表,但更改不会应用于基表

检查答案,它们更好地解释了为什么应该使用视图而不是实际查询。-1,如果视图使用
MERGE
算法且列未派生,MySQL视图将使用索引。我知道这一点。当视图使用合并算法时,MySQL视图可以“使用”基础表的索引。在视图上创建索引是不可能的。你真的不知道自己在说什么。视图与普通查询一样高效,有时更高效(取决于您如何使用它们)@RanjitKumar,连接缓冲区在MySQL中分配给每个线程,甚至可以分配给每个不能使用索引的连接(因此每个查询有多个缓冲区)。将连接缓冲区增加到300MB不是一个好主意。你可以让MySQL进入交换内存,或者干脆让它崩溃。MySQL视图不需要刷新。MySQL不支持物化视图。