MySQL查看性能TEMPTABLE或MERGE?

时间:2017-02-28 16:20:36

标签: mysql query-optimization

我有一个视图来自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结果并改为使用它?

2 个答案:

答案 0 :(得分:2)

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

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

如果您想讨论特定案例,请提供SHOW CREATE VIEWSHOW 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