我有一个视图来自2个不经常更改的表(它们每天更新一次或两次)并且最多有2000行和1000行。
哪种算法应该更好,MERGE或TEMPTABLE?
想知道,MySQL是否会缓存查询结果,使TEMPTABLE成为我的最佳选择?
阅读https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html我明白,基本上,MERGE算法会将视图代码注入调用它的查询中,然后运行。 TEMPTABLE算法将使视图首先运行,将其结果存储到临时表中然后使用。但没有提到缓存。
我知道我可以选择自己实现物化视图(http://www.fromdual.com/mysql-materialized-views)。 MySQL能否自动缓存TEMPTABLE结果并改为使用它?
答案 0 :(得分:2)
哪种算法?它取决于特定的查询和架构。 通常优化器会选择更好的方法,您不应该指定。
但是......有时优化器会选择非常糟糕的方法。那时,唯一真正的解决方案是不使用Views。也就是说,某些视图无法与等效的SELECT
进行优化。
如果您想讨论特定案例,请提供SHOW CREATE VIEW
和SHOW CREATE TABLEs
以及SELECT
来调用该视图。并构建等效的SELECT
。同时包括EXPLAIN
的{{1}}。
答案 1 :(得分:0)
一般来说,MERGE
算法是首选,因为它允许您的视图使用表索引,并且不会在创建临时表时引入延迟(如TEMPTABLE
那样)。
实际上这就是MySQL Optimizer默认执行的操作 - 当一个视图的算法UNDEFINED
(默认情况下是这样)时,如果可以,MySQL将使用MERGE
,否则它&# 39; ll使用TEMPTABLE
。
有一点需要注意(这给我带来了很多痛苦),如果您的视图包含any of the following constructs:
,MySQL将不会使用MERGE
算法
阻止合并的构造对于派生表和视图引用是相同的:
聚合函数(SUM(),MIN(),MAX(),COUNT()等)
DISTINCT
GROUP BY
HAVING
LIMIT
UNION或UNION ALL
选择列表中的子查询
分配给用户变量
仅引用文字值(在这种情况下,没有基础表)
在这种情况下,将使用TEMPTABLE
,这可能会导致性能问题而没有任何明确的原因。在这种情况下,最好使用存储过程或子查询而不是视图
感谢MySQL