
回复
线上使用MySQL8.0.25的数据库,通过监控发现数据库在查询一个视图(80张表的union all)时内存和cpu均明显上升。
在8.0.25 MySQL Community Server官方版本测试发现:只能在视图上进行数据过滤,不能将视图上的过滤条件下推到视图内的表上进行数据过滤。8.0.29以后的版本已解决该问题。
下面是在8.0.25 MySQL Community Server上做的测试
从执行计划上看,先对视图内的表进行全表扫描,最后在视图上过滤数据。
添加官方的 merge hint 进行视图合并(期望视图不作为一个整体,让where上的过滤条件能下推到视图中的表),不能改变sql执行计划,优化器需要先进行全表扫描在对结果集进行过滤。sql语句的执行时间基本不变
查询视图(过滤条件在视图上)
直接运行sql语句
直接运行sql语句或者把过滤条件放到视图内均能很快得到数据。
新的MySQL8.0.32版本 已解决掉该问题,视图上的过滤条件能下推到表上。
文章转载自公众号:GreatSQL社区