MySQL派生表重构 || MySQL专题3

李海翔 2015-11-17 14:39:00
承接上期,今天继续为大家带来MySQL视图优化的原创专家文章分享,来自DBA+社群MySQL领域原创专家——李海翔。以下是第三部分的内容。

专家简介

 
 


李海翔

网名:那海蓝蓝

DBA+社群MySQL领域原创专家


从事数据库研发、数据库测试与技术管理等工作10余年,对数据库的内核有深入研究,擅长于PostgreSQL和MySQL等开源数据库的内核与架构。现任职于Oracle公司MySQL全球开发团队,从事查询优化技术的研究和MySQL查询优化器的开发工作。著有《数据库查询优化器的艺术》一书。

 

 

2 V5.7.5 视图和FROM子句中的派生表的重构


相关工作参见:http://dev.mysql.com/worklog/task/?id=5275


2.1.1 V5.7.5 视图和FROM子句中的派生表的重构内容


最近几年,MySQL的优化器进步很快,MySQL的Optimizer团队对于优化器作了许多的优化工作。


MySQL在5.7.5版本中,对于视图和FROM子句中的DERIVED table进行了一次重构工作,工作的结果:


1)从概念、编码实现的角度,统一了二者的处理方式,使得相似的内容处理(视图和派生表的处理方式)逻辑保持了一致,同一套代码清晰便于理解


2)提高了FROM子句中派生表的处理效率(对于可以merge的视图和派生表采用merge优化)


3)对于不可merge的视图和派生表采用“物化”的方式进行优化,达到只执行一次多次使用的优化目的


例如:



从这个例子中可以看到,5.7.5版本中对于派生表采用了merge优化,消除了5.5中的子查询。这样查询效率得到较大提高。


从编码首先看,5.5代码mysql_make_view()中合并(merge)优化的代码被取出,这样就消除了单独优化视图的可能。


在sql_resolve.cc文件中通过调用SELECT_LEX::resolve_derived()统一对视图和派生表进行了如下操作:



其中,tl可以是视图或派生表,这样的对象,要么被采用“合并”的方式优化,要么被采用“物化”的方式优化。


如下是一个物化的例子(派生表中多了一个LIMIT子句)。



其实,MySQL优化器的进化一直在进行着,有些进步尽管不如5.7.5对派生表和视图的优化进步大,但每一个版本,总是在向前迈进。如5.6.3,物化操作只发生在执行阶段,如果是EXPLAIN获得执行计划,则物化操作不发生。


Materialization of subqueries in the FROM clause is postponed until their contents are needed during query execution, which improves performance。


2.1.2 V5.7.5 视图和FROM子句中的派生表的重构的限制


不是所有的视图和派生表都可以被merge,不可merge的情况,类似1.4节,即简单视图或派生表,可以被merge,复杂视图和带有GROUP/HAVING/DISTINCT/LIMIT/聚集函数等子句的派生表只能被物化。

本文由作者李海翔授权DBA+社群发布,选自作者网易博客

即日起,凡是推送在DBAplus社群】平台的文章,阅读量超过1000,该文章作者可获得一本赠书。大家如有好的干货文章也可以向我们的订阅号投稿,投稿邮箱:1017465571@qq.com。近期赠书有:白鳝《思想的天空》、杨志洪《Oracle核心技术》……
 

关注DBA+社群微信公众号:dbaplus

 

回复“上海沙龙”,获取DBA+社群数据库技术沙龙·上海站PPT;

回复“广州沙龙”,获取DBA+社群数据库技术沙龙·广州站PPT;

回复“OOW大会”,获取2015 Oracle OpenWorld大会PPT;

回复“2015GOPS”,获取2015 GOPS:全球运维大会·上海站PPT;

回复“DCon2015”,获取DCon 2015大会演讲PPT。

 

最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告