MySql-sql语句执行流程

MySql内部组件结构

image.png

Server层

链接器

管理链接与权限校验
链接数据库时负责监听数据库端口请求的即是链接器。
链接命令以下所示:
# mysql ‐h host[数据库地址] ‐u root[用户] ‐p root[密码] ‐P 3306
链接命令中的 mysql 是客户端工具,用来跟服务端创建链接。在完成经典的 TCP 握手后,链接器就要开始认证你的身份,
这个时候用的就是你输入的用户名和密码。
一、若是用户名或密码不对,你就会收到一个"Access denied for user"的错误,而后客户端程序结束执行。
二、若是用户名密码认证经过,链接器会到权限表里面查出你拥有的权限。以后,这个链接里面的权限判断逻辑,都将依赖于此时读到的权
限。
这就意味着,一个用户成功创建链接后,权限会缓存在一个seesion中,此时即便你用管理员帐号对这个用户的权限作了修改,也不会影响已经存在链接的权
限。修改完成后,只有再新建的链接才会使用新的权限设置。用户的权限表在系统表空间的mysql的user表中。

查询缓存

一个特别鸡肋的存在,就是把查询结果放在缓存里,下次有一样的sql直接从缓存中取数据,但对缓存数据所关联的表的任何修改都会致使缓存被清空,只有在变化几乎没有的静态表有存在价值,8.0之后的mysql已经移除了查询缓存

语法分析器

若是没有命中缓存,那么mysql即将开始分析输入的sql语句,根据sql语句的关键字和语句结构对sql进行拆分,识别出SQL的目的。
词法分析器分红6个主要步骤完成对sql语句的分析
一、词法分析
二、语法分析
三、语义分析
四、构造执行树
五、生成执行计划
六、计划的执行

image.png

SQL语句的分析分为词法分析与语法分析,mysql的词法分析由MySQLLex[MySQL本身实现的]完成,语法分析由Bison生
成,通过bison语法分析以后,会生成一个这样的语法树

image.png

优化器

通过了分析器,MySQL 就知道你要作什么了。在开始执行以前,还要先通过优化器的处理。
优化器是在表里面有多个索引的时候,决定使用哪一个索引;或者在一个语句有多表关联(join)的时候,决定各个表的链接顺序。
若是有多种方案最终的执行结果是相同的,那么优化器会选择一个执行效率更高的方案。

执行器

优化事后mysql就已经肯定了该sql语句的目的,开始执行过程以前会先进行权限判断,若是权限没有问题则开表执行,不然返回错误信息。
执行过程根据表的存储引擎类型去调用引擎提供的接口,例如innoDB等存储引擎。

store层

mysql的store层比较经常使用的有三种
innoDB,Myisam,memory

bin-log归档

mysql的binlog是Server层实现的二进制日志,他会记录咱们的cud操做,特色以下:
一、Binlog在Server层实现(引擎共用)
二、Binlog为逻辑日志,记录的是一条语句的原始逻辑
三、Binlog不限大小,追加写入,不会覆盖之前的日志
误删数据/库,可使用binlog进行归档恢复!
但须要先开启MySQL的binlog功能。
配置my.cnf开启binlog
log‐bin=/usr/local/mysql/data/binlog/mysql‐bin
binlog‐format=ROW
sync‐binlog=1

注意5.7以及更高版本须要配置本项:server‐id=123454(自定义,保证惟一性);
 #binlog格式,有3种statement,row,mixed,statement表示存储执行的sql语句,分布式的时候有可能形成数据不一致;row表示存储的是sql执行后最终的数据结果,但会影响效率;mixed是前两种的合体,效率最低。
相关文章
相关标签/搜索