包含UNION的MySQL视图不能很好地优化...换句话说,慢!

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优化查看查询的方式吗?顺便说一句,我甚至无法针对视图运行解释计划,因为它永远不会返回.

OMG*_*ies 6

您遇到的行为是如何在每个数据库上处理非物化视图.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中提取记录.那就是处理数百万条记录的问题......