mysqld 程序运行原理
mysqld 程序结构
连接层:执行上调语句 首先要连接到数据库
连接层
1.提供链接协议(连接的方法)
socket(方法1 本地连接)
TCP/IP(方法2 远程连接)
2.接收到命令 验证用户名(root@'loacalhost')密码的合法性
验证用户 验证地址
3.接受SQL语句 派生一个专用的链接线程(接受语句 返回结果)
返回结果
show processlist; 查看当前连接的线程
思考
改密码的参数在哪里做的手脚
--skip-grant-tables 跳过授权表 不验证用户名密码
--skip-networking 仅限本地登陆 否则就成裸奔了
SQL层(优化方面,至关重要的)
专门做语句的处理工作 SQL转给SQL层来进行处理
连接层输入语句 回车 就交到了SQL层 之后
第一步 :验证SQL语法 和 SQL_MODE 是否正确
第二部 :验证语义
第三部 :验证这条SQL语句的权限
第四部 :SQL语句预处理
1.解析器进行语句解析 生成执行计划a b c三中方案(解析树)
2.优化器 有各种基于执行代价的算法
根据算法 找到代价最低的执行计划
代价:基于 CPU IO 内存 资源的消耗
第五步 :执行器按照优化器选择执行计划 执行SQL语句
得出获取数据的方法
未完待续 :假设命令不停的执行很多次
不可能整个流程都走一遍 这样浪费资源
这时候提供query cache缓存服务(默认不开) 不过这个一般是不开的 都是用Redis替代
记录操作日志 (binlog日志)包括备份恢复 主从复制
手动开 默认也不开 非常重要的日志文件
SQL层 提供的日志 只记录修改类的操作
存储引擎层(和磁盘打交道的一个层次)
根据SQL提供的获取数据的方法 拿到数据 返回给SQL层 数据结构换成人类可读的数据表的结构
再由连接层的线程 返回给用户