
一背景和架构
本文基于源码进行分析和总结。这里MySQLServer层指的是MySQL的优化器、执行器部分。我们对MySQL的理解还建立在5.6和5.7版本的理解之上,更多的是对比PostgreSQL或者传统数据库。然而从开始,持续每三个月的迭代和重构工作,使得MySQLServer层的整体架构有了质的飞越。下面来看下MySQL最新的架构。

我们可以看到最新的MySQL的分层架构和其他数据库并没有太大的区别,另外值得一提的是从图中可以看出MySQL现在更多的加强InnoDB、NDB集群和RAPID(HeatWaveclusters)内存集群架构的演进。下面我们就看下具体细节,我们这次不随着官方的Feature实现和重构顺序进行理解,本文更偏向于从优化器、执行器的流程角度来演进。
二MySQL解析器Parser
首先从Parser开始,官方使用Bison进行了重写,生成ParserTree,同时ParserTree会contextualize生成MySQL抽象语法树(AbstractSyntaxTree)。

MySQL抽象语法树和其他数据库有些不同,是由比较让人拗口的SELECT_LEX_UNIT/SELECT_LEX类交替构成的,然而这两个结构在最新的版本中已经重命名成标准的SELECT_LEX-Query_block和SELECT_LEX_UNIT-Query_expression。Query_block是代表查询块,而Query_expression是包含多个查询块的查询表达式,包括UNIONAND/OR的查询块(如SELECT*FROMt1unionSELECT*FROMt2)或者有多Level的ORDERBY/LIMIT(如SELECT*FROMt1ORDERBYaLIMIT10)ORDERBYbLIMIT5。
例如,来看一个复杂的嵌套查询:
(SELECT*FROMttt1)UNIONALL(SELECT*FROM(SELECT*FROMttt2)ASa,(SELECT*FROMttt3UNIONALLSELECT*FROMttt4)ASb)
在MySQL中就可以用下面方式表达:

经过解析和转换后的语法树仍然建立在Query_block和Query_expression的框架下,只不过有些LEVEL的queryblock被消除或者合并了,这里不再详细展开。
三MySQLprepare/rewrite阶段
接下来我们要经过resolve和transformation过程Query_expression::prepare-Query_block::prepare,这个过程包括(按功能分而非完全按照执行顺序):
1SetupandFix
setup_tables:Setuptableleavesinthequeryblockbasedonlistoftables.
resolve_placeholder_tables/merge_derived/setup_table_function/setup_materialized_derived:Resolvederivedtable,viewortablefunctionreferencesinqueryblock.
setup_natural_join_row_types:Computeandstoretherowtypesofthetop-mostNATURAL/USINGjoins.
setup_wild:Expandall'*'inlistofexpressionswiththematchingcolumnreferences.
setup_base_ref_items:Setquery_block'sbase_ref_items.
setup_fields:Checkthatallgivenfieldsexistsandfillstructwithcurrentdata.
setup_conds:ResolveWHEREconditionandjoinconditions.
setup_group:ResolveandsetuptheGROUPBYlist.
m_having_cond-fix_fields:SetuptheHAVINGclause.
resolve_rollup:ResolveitemsinSELECTlistandORDERBYlistforrollupprocessing.
resolve_rollup_item:Resolveanitem(anditstree)forrollupprocessingbyreplacingitemsmatchinggroupedexpressionswithItem_rollup_group_itemsandupdatingproperties(m_nullable,PROP_ROLLUP_FIELD).AlsocheckanyGROUPINGfunctionforincorrectcolumn.
setup_order:SetuptheORDERBYclause.
resolve_limits:ResolveOFFSETandLIMITclauses.
Window::setup_windows1:Setupwindowsaftersetup_order()andbeforesetup_order_final().
setup_order_final:DofinalsetupofORDERBYclause,afterthequeryblockisfullyresolved.
setup_ftfuncs:Setupfull-textfunctionsafterresolvingHAVING.
resolve_rollup_wfs:ReplacegroupbyfieldreferencesinsidewindowfunctionswithreferencesinthepresenceofROLLUP.
2Transformation
remove_redundant_subquery_clause:Permanentlyremoveredundantpartsfromthequeryif1)Thisisasubquery2),notwhentheviewiscreated.
remove_base_options:RemoveSELECT_DISTINCToptionsfromaqueryblockifcanskipdistinct.
resolve_subquery:Resolvepredicateinvolvingsubquery,performearlyunconditionalsubquerytransformations.
Convertsubquerypredicateintosemi-join,or
Markthesubqueryforexecutionusingmaterialization,or
PerformIN-EXISTStransformation,or
Performmore/lessALL/ANY-MIN/MAXrewrite
Substitutetrivialscalar-contextsubquerywithitsvalue
transform_scalar_subqueries_to_join_with_derived:Transformeligiblescalarsubqueriestoderivedtables.
flatten_subqueries:le.
apply_local_transforms:
delete_unused_merged_columns:Ifqueryblockcontainsoneormoremergedderivedtables/views,walkthroughlistsofcolumnsinselectlistsandremoveunusedcolumns.
simplify_joins:Convertallouterjoinstoinnerjoinsifpossible
prune_partitions:Performpartitionpruningforagiventableandcondition.
push_conditions_to_derived_tables:Pushingconditionsdowntoderivedtablesmustbedoneaftervaliditychecksofgroupedqueriesdonebyapply_local_transforms();
Window::eliminate_unused_objects:Eliminateunusedwindowdefinitions,redundantsortsetc.

3对比PostgreSQL
为了更清晰的理解标准数据库的做法,我们这里引用了PostgreSQL的这三个过程:
Parser
下图首先Parser把SQL语句生成parsetree。
testdb=CREATEVIEWemployees_listsampledb-FROMemployeesASe,_id=;
下图的例子就是一个包含view的querytree如何展开成新的querytree。
sampledb=EXPLAINSELECT*FROMtbl_aWHEREid300ORDERBYdata;QUERYPLAN---------------------------------------------------------------Sort(cost=182.34..183.09rows=300width=8)SortKey:data-SeqScanontbl_a(cost=0.00..170.00rows=300width=8)Filter:(id300)(4rows)

五总结
本文主要focus在MySQL最新版本官方的源码上,重点分析了官方的重构在多阶段和各阶段结构上的变化和联系,更多的是为了让大家了解一个全新的MySQL的发展。
关于我们PolarDB是阿里巴巴自主研发的云原生分布式关系型数据库,于2020年进入Gartner全球数据库Leader象限,并获得了2020年中国电子学会颁发的科技进步一等奖。PolarDB基于云原生分布式数据库架构,提供大规模在线事务处理能力,兼具对复杂查询的并行处理能力,在云原生分布式数据库领域整体达到了国际领先水平,并且得到了广泛的市场认可。在阿里巴巴集团内部的最佳实践中,PolarDB还全面支撑了2020年天猫双十一,并刷新了数据库处理峰值记录,高达1.4亿TPS。欢迎有志之士加入我们,简历请投递到@,期待与您共同打造世界一流的下一代云原生分布式关系型数据库。
数据库技术图谱数据库技术图谱由阿里云数据库专家团出品,含7个知识点,17个课程,6个体验场景,9个公开课,带你从基础到进阶玩转常见数据库,同时深入实战,学习阿里云使用各数据库的最佳实践!
免责声明:本文章如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系