我有一个包含UNION ALL的视图.例如:
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中提取记录.那就是处理数百万条记录的问题……
标签:performance,sql,mysql,view,union
来源: https://codeday.me/bug/20190827/1738553.html