很多开发同学对SQL优化很熟悉,但是对MySQL的架构却不是很了解。是不是只见叶不见林,终将陷于细节之中不能自拔。今天,就让我们一起来学习一下MySQL的分层架构,深入了解MySQL的底层实现原理和各层的作用。哪一层针对我们常见的SQL优化进行了优化?1、MySQL的整体架构从图中可以看出,MySQL的架构主要分为服务器层和存储引擎层。Server层进一步分为连接器、缓存、分析器、优化器和执行器。所有跨存储引擎的功能都在这一层实现,例如:函数、存储过程、触发器、视图等。存储引擎是可插拔的。常见的存储引擎有MyISAM、InnoDB、Memory等,MySQL5.5之前默认是MyISAM,之后默认是InnoDB。2.连接器连接器主要用于管理客户端连接和用户认证。客户端和服务器之间的连接使用TCP协议。TCP握手后,连接建立后,连接器开始认证。>mysql-hlocalhost-P3306-uroot-p如果认证失败,会出现错误ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:YES)。可以使用showprocesslist命令查看系统中所有连接的信息:Commond列表示连接状态,Daemon表示后台进程,Query表示查询,Sleep表示空闲连接。3、查询缓存客户端请求不会直接去存储引擎查询数据,而是先检查缓存中是否存在结果。如果结果已经存在,直接返回,否则重新执行查询过程,查询完成后缓存结果。如果数据表发生变化,失效缓存会被清空,如insert、update、delete、alter等操作。对于频繁变化的数据表,缓存命中率很低。缓存的使用降低了读写性能,所以在MySQL8.0之后去掉了缓存模块。可以使用如下命令查看缓存是否开启:4.分析器分析器主要对SQL语句进行词法分析和语法分析。首先进行词法分析,分析MySQL的关键字和每个词的含义。然后进行语法分析,检测SQL语句是否符合MySQL语法要求。MySQL识别字符串中的列名、表名、where、select/update/insert等MySQL关键字,根据语法规则判断SQL是否满足语法,最后生成抽象语法树(AST)。比如SQL语句中少了一个where关键字,就会提示错误。mysql>select*fromuserid=1;ERROR1064(42000):你的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第15行的'=1'附近使用的正确语法。在优化器实际执行SQL语句之前,它需要由优化器进行处理。众所周知的执行计划(Explain)是由优化器生成的。优化器有两个主要功能:逻辑优化和物理优化。逻辑优化主要进行等价谓词重写、条件简化、子查询消除、连接消除、语义优化、分组合并、选择下推、索引优化查询、表查询替换视图查询、联合替换或运算等。物理优化的主要功能就是通过贪心算法,根据成本估算模型估算出每种执行方式的成本。并利用索引优化表连接,最终生成查询执行计划。附上MySQL优化器架构图,可以清楚的看到优化过程:想知道优化器的预估结果信息,可以通过Explain查看,关注一登。下一篇文章会详细讲解Explain的具体用法。6.Executor优化器优化SQL并生成执行计划后,会将执行计划传递给Executor。执行器调用存储引擎接口实际执行SQL查询。获取存储引擎返回的查询结果,并将结果返回给客户端,SQL语句的执行结束。7、小结本文主要带大家了解MySQL分层架构以及各层架构的作用。可以看出,MySQL的每一层分工明确,逻辑清晰,深刻体现了架构设计中“高内聚低耦合”的设计思想。我们平时做架构设计的时候,也需要多了解一下这种分层架构的设计思想。文章持续更新中,大家可以在微信搜索“一光架构”第一时间阅读更多技术干货。
