Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL视图性能是诱人的还是合并的?_Mysql_Query Optimization - Fatal编程技术网

MySQL视图性能是诱人的还是合并的?

MySQL视图性能是诱人的还是合并的?,mysql,query-optimization,Mysql,Query Optimization,我有一个视图,其中来自2个不经常更改的表(它们每天更新一到两次)的查询最多有2000行和1000行 哪种算法应该表现得更好,合并还是诱人 我想知道,MySQL会缓存查询结果吗?在我的情况下,它会成为最好的选择吗 通过阅读,我了解到基本上,合并算法将在调用它的查询中注入视图代码,然后运行。诱人的算法将首先运行视图,将其结果存储到临时表中,然后使用。但没有提到缓存 我知道我可以选择自己实现物化视图()。MySQL能自动缓存诱人的结果并使用它吗?哪种算法?它取决于特定的查询和模式。通常,优化器会选择更

我有一个视图,其中来自2个不经常更改的表(它们每天更新一到两次)的查询最多有2000行和1000行

哪种算法应该表现得更好,合并还是诱人

我想知道,MySQL会缓存查询结果吗?在我的情况下,它会成为最好的选择吗

通过阅读,我了解到基本上,合并算法将在调用它的查询中注入视图代码,然后运行。诱人的算法将首先运行视图,将其结果存储到临时表中,然后使用。但没有提到缓存


我知道我可以选择自己实现物化视图()。MySQL能自动缓存诱人的结果并使用它吗?

哪种算法?它取决于特定的查询和模式。通常,优化器会选择更好的方法,您不应该指定

但是。。。有时候,优化器会选择非常糟糕的方法。此时,唯一真正的解决方案是不使用视图。也就是说,某些视图无法与等效的
SELECT
一样进行优化


如果您想讨论特定案例,请提供
显示创建视图
显示创建表
,以及调用视图的
选择
。然后构造等价的
选择
。还包括
EXPLAIN
对于这两个
选项

一般来说,首选
合并
算法,因为它允许您的视图利用表索引,并且不会在创建临时表时引入延迟(就像
可诱惑的
那样)

事实上,这就是MySQL优化器在默认情况下所做的事情——当视图的算法
未定义时(默认情况下),MySQL将使用
合并
,否则将使用
可诱惑的

需要注意的一件事(这让我非常痛苦)是,如果您的视图包含

对于派生表和视图引用,阻止合并的构造是相同的:

  • 聚合函数(SUM()、MIN()、MAX()、COUNT()等)

  • 明显的

  • 分组

  • 拥有

  • 极限

  • 联合还是全体联合

  • 选择列表中的子查询

  • 用户变量的赋值

  • 仅引用文字值(在本例中,没有基础表)

在这种情况下,将使用
attreable
,这可能会在没有任何明确原因的情况下导致性能问题。在这种情况下,最好使用存储过程或子查询而不是视图

谢谢你的MySQL