包含UNION的MySQL视图不能优化,换句话说,SLOW!

问题描述:

我有一个包含UNION ALL的视图。例如:包含UNION的MySQL视图不能优化,换句话说,SLOW!

CRATE VIEW myView as 
(SELECT col1, col2, col3 
FROM tab1) 
UNION ALL 
(SELECT col1, col2, col3 
FROM tab2) 

这些是大型表,每个表中包含数百万行。如果我写:

SELECT * 
FROM myView 
LIMIT 1; 

而不是立即,它基本上永远不会返回其他查询写入此视图。如果我在针对单个基础表的查询中使用LIMIT,则它是立即的。我有基础表上的索引。看起来MySQL在应用任何过滤标准之前为视图创建了整个聚合数据集(视图内的查询)。疯了吧。这是MySQL优化查询查询的方式吗?顺便说一句,我甚至无法针对视图运行解释计划,因为它永远不会返回。

您遇到的行为是如何在每个数据库上处理非物化视图。 MySQL不支持实体化视图,它的视图支持甚至不能与竞争对手相提并论...

非物化视图只是它封装的查询的简写/宏/变量 - 没有区别使用:

SELECT * 
    FROM myView 
LIMIT 1 

...和:

SELECT x.* 
    FROM (SELECT col1, col2, col3 
      FROM TAB1 
     UNION ALL 
     SELECT col1, col2, col3 
      FROM TAB2) x 
LIMIT 1 

没有一个ORDER BY,充其量你要根据插入您的查询来获取第一行,你还不如正在运行:

SELECT col1, col2, col3 
    FROM TAB1 
LIMIT 1 

...因为由于UNIONed语句返回记录的顺序,不太可能从TAB2中提取记录。然后就是处理数百万条记录的问题......