MySql一条语句执行的过程


连接层(接收语句,返回结果)

首先需要先连接到数据库,因为Linux本身不能执行sql语句

1、提供连接协议:socket、TCP/IP

2、验证用户名密码合法性,匹配专门的授权表

3、派生一个专用的连接线程用于接收SQL语句和返回结果

忘记密码的那两个参数,说白了就是在连接层动手脚

--skip-grant-tables:忽略授权表

--skip-networking:忽略TCP/IP登录,只能本地socket登录


SQL层(处理语句,提供查询)

1、验证SQL语法和SQL_MODE(sql_mode是一组语法校验规则)

2、验证语义(哪一类的语句?DQL/DDL/DML/DCL)

3、验证权限(是否有权限操作这个库和表?)

4、解析器进行语句的解析

5、优化器(各种算法,用最小的代价制定执行计划)

6、执行器按照优化器选择的执行计划,执行SQL语句

7、对于执行一条语句多次不会每次都执行这个过程,通过query cache来提升查询的速度(默认是不开启的)。一般也不开,会用redis代替这个功能。验证语句是否相同是先将SQL语句哈希,算出来的值也叫SQL_ID,比较SQL_ID是否一致,就能比较出2条语句是否是同一内容。

8、记录操作日志(binlog),用于提供数据库恢复的重要依据。也是默认关闭的


存储引擎层(拿取数据)

真正和磁盘交互的层

根据SQL层提供的取数据的方法,拿到数据。

返回给SQL层,SQL层把二进制数据结构化成表。同时SQL层会把结果缓存到缓存层。(缓存有可能是query cache或者redis或者memcached)

再返回给连接层返回给用户结果。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容