连接层(接收语句,返回结果)
首先需要先连接到数据库,因为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)
再返回给连接层返回给用户结果。