欢迎光临国标麻将

Python之MySql未解之谜04--一条sql语句执行过程

港台 2020-06-06 23:105015国标麻将国标麻将app

图1

从图1中Python大星发现MySql主要分成:

●服务端

①连接器

主要负责登录MySql数据库,三要素:主机地址、用户名、密码。通常在企业开发过程种,运维会给开发人员分配一个查询权限的账号,避免对数据库误操作修改和删除。

例如连接远程数据库,端口3306,用户名为root,密码123456,命令如下

在连接器中,仅仅获取了权限信息,,

真正进行查询和操作在执行器中的时候才会判断有没有操作这个表的权限

②查询缓存

现在大部分应用把缓存放到客户端,如使用Redis

注意:在表的结构或数据发生改变时,查询缓存中的数据不再有效。

③解析器

I、词法分析:提取关键字,如select、from、where等

II、语法分析:判断sql是否符合语法规则

如果语法不对,会出现错误题型:

YouhaveanerrorinyourSQLsyntax

重写SQL语句,创造一个有效率的执行计划

⑤执行器

判断是否有查询/删除/更新权限

调用相应的引擎提供的接口,返回接口执行的结果

●存储引擎

小试牛刀从5.5版本后MySql默认存储引擎?0人0%A.MyISAM0人0%B.InnoDB0人0%C.NDB0人0%D.Memory投票

那么,一条SQL语句在MySql数据到底发生了什么?

让我们一探究竟......

查询语句

假设user表中,name和age都加上索引,name='Python大星'的数据有900条,age=18的有300条,满足name='Python大星'和age=18有30条

●用户权限校验,如果失败,返回错误信息;用户校验成功,下一步

●MySql8.0之前会先查询缓存,如果存在,直接返回缓存结果;如果没有,下一步

●通过解析器进行词法分析,比如提取上面这个语句是查询select,提取需要查询的表名为user,查询条件是name='Python大星',age=18。然后判断这个sql语句是否有语法错误等等,下一步

●先测试name会有900个数据行,需要检查它们找到其中的30个与age中的值匹配记录,其中就有870次是失败了。

先测试age会有300个数据行,需要检查它们找到其中的30个与name中的值匹配的记录,只有270次是失败的,因此需要的计算和磁盘I/O更少。

其结果是,优化器会先测试age,因为这样做开销更小

●进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果

更新语句

基本流程和查询语句一样。

InnoDB存储引擎

●第一步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝

●第二步:生成一条重做日志并写入redologbuffer,记录的是数据被修改后的值

所以崩溃恢复的时候,redologbuffer也能找回来

●第三步:当事务commit时,将redologbuffer中的内容刷新到redologfile

Copyright © 2020 国标麻将 版权所有