【问题标题】:MySQL view performance TEMPTABLE or MERGE?MySQL 视图性能 TEMPTABLE 还是 MERGE?
【发布时间】:2017-07-19 17:23:07
【问题描述】:

我有一个视图,其中查询来自 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 结果并使用它吗?

【问题讨论】:

    标签: mysql query-optimization


    【解决方案1】:

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

    但是...有时优化器会选择非常糟糕的方法。在这一点上,唯一真正的解决方案是不使用视图。也就是说,某些 View 无法像等效的 SELECT 那样优化。

    如果您想讨论特定案例,请提供SHOW CREATE VIEWSHOW CREATE TABLEs,以及调用视图的SELECT。并构造等价的SELECT。还包括EXPLAIN 两个SELECTs

    【讨论】:

      【解决方案2】:

      一般来说,MERGE 算法是首选,因为它允许您的视图利用表索引,并且不会在创建临时表时引入延迟(如 TEMPTABLE 所做的那样)。

      事实上这是 MySQL 优化器默认做的事情——当视图的算法UNDEFINED(默认情况下)MySQL 会使用MERGE,否则它会使用TEMPTABLE

      需要注意的一点(这让我很痛苦)是如果您的视图包含any of the following constructs:,MySQL 将不会使用MERGE 算法

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

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

      • 不同的

      • 分组方式

      • 拥有

      • 限制

      • 联合或联合所有

      • 选择列表中的子查询

      • 分配给用户变量

      • 仅引用文字值(在这种情况下,没有基础表)

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

      感谢 MySQL ?

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多