mysql中union可以怎样优化,包含UNION的MySQL视图不能很好地优化…换句话说,慢!

我有一个包含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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值