包含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中提取记录。然后就是处理数百万条记录的问题......