MySQL视图性能是诱人的还是合并的?
我有一个视图,其中来自2个不经常更改的表(它们每天更新一到两次)的查询最多有2000行和1000行 哪种算法应该表现得更好,合并还是诱人 我想知道,MySQL会缓存查询结果吗?在我的情况下,它会成为最好的选择吗 通过阅读,我了解到基本上,合并算法将在调用它的查询中注入视图代码,然后运行。诱人的算法将首先运行视图,将其结果存储到临时表中,然后使用。但没有提到缓存MySQL视图性能是诱人的还是合并的?,mysql,query-optimization,Mysql,Query Optimization,我有一个视图,其中来自2个不经常更改的表(它们每天更新一到两次)的查询最多有2000行和1000行 哪种算法应该表现得更好,合并还是诱人 我想知道,MySQL会缓存查询结果吗?在我的情况下,它会成为最好的选择吗 通过阅读,我了解到基本上,合并算法将在调用它的查询中注入视图代码,然后运行。诱人的算法将首先运行视图,将其结果存储到临时表中,然后使用。但没有提到缓存 我知道我可以选择自己实现物化视图()。MySQL能自动缓存诱人的结果并使用它吗?哪种算法?它取决于特定的查询和模式。通常,优化器会选择更
我知道我可以选择自己实现物化视图()。MySQL能自动缓存诱人的结果并使用它吗?哪种算法?它取决于特定的查询和模式。通常,优化器会选择更好的方法,您不应该指定 但是。。。有时候,优化器会选择非常糟糕的方法。此时,唯一真正的解决方案是不使用视图。也就是说,某些视图无法与等效的
SELECT
一样进行优化
如果您想讨论特定案例,请提供
显示创建视图
和显示创建表
,以及调用视图的选择
。然后构造等价的选择。还包括EXPLAIN
对于这两个选项
一般来说,首选合并
算法,因为它允许您的视图利用表索引,并且不会在创建临时表时引入延迟(就像可诱惑的
那样)
事实上,这就是MySQL优化器在默认情况下所做的事情——当视图的算法未定义时(默认情况下),MySQL将使用合并,否则将使用可诱惑的
需要注意的一件事(这让我非常痛苦)是,如果您的视图包含
对于派生表和视图引用,阻止合并的构造是相同的:
- 聚合函数(SUM()、MIN()、MAX()、COUNT()等)
- 明显的
- 分组
- 拥有
- 极限
- 联合还是全体联合
- 选择列表中的子查询
- 用户变量的赋值
- 仅引用文字值(在本例中,没有基础表)
在这种情况下,将使用attreable
,这可能会在没有任何明确原因的情况下导致性能问题。在这种情况下,最好使用存储过程或子查询而不是视图
谢谢你的MySQL