Gre*_*egH 3 mysql sql performance union view
我有一个包含UNION ALL的视图.例如:
CRATE VIEW myView as
(SELECT col1, col2, col3
FROM tab1)
UNION ALL
(SELECT col1, col2, col3
FROM tab2)
Run Code Online (Sandbox Code Playgroud)
这些是大型表,每个表包含数百万行.如果我写:
SELECT *
FROM myView
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
而不是立即,它基本上永远不会返回,因为针对此视图编写的其他查询.如果我在针对各个基础表的查询中使用LIMIT,则它是立即的.我在底层表上有索引.似乎MySQL在应用任何过滤条件之前为视图创建了整个聚合数据集(视图中的查询).疯了吧.这是MySQL优化查看查询的方式吗?顺便说一句,我甚至无法针对视图运行解释计划,因为它永远不会返回.
您遇到的行为是如何在每个数据库上处理非物化视图.MySQL不支持物化视图,它的视图支持甚至与竞争对手不相上下......
非物化视图只是它封装的查询的简写/宏/变量 - 使用之间没有区别:
SELECT *
FROM myView
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
...和:
SELECT x.*
FROM (SELECT col1, col2, col3
FROM TAB1
UNION ALL
SELECT col1, col2, col3
FROM TAB2) x
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
如果没有ORDER BY,最多你将根据查询的插入获得第一行,你可能也在运行:
SELECT col1, col2, col3
FROM TAB1
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
...因为由于UNIONed语句返回的记录顺序,它不太可能从TAB2中提取记录.那就是处理数百万条记录的问题......
| 归档时间: |
|
| 查看次数: |
1420 次 |
| 最近记录: |