基础层
上图可以看出mysql架构主要分三个层次:
第一层 client客户端 管理连接,权限验证
第二层 server层 词法分析,语法分析,执行计划,索引选择,操作引擎,返回结果
第三层 存储引擎 存储数据,提供读写接口
连接器
▪ 连接器负责跟客户端建立连接,获取权限、维持和管理连接
– 用户名密码验证
– 查询权限信息,分配对应的权限
– 可以使用show processlist查看现在的连接
– 如果太长时间没有动静,就会自动断开,通过wait_timeout控制,默认8小时
▪ 连接可以分为两类:
– 长连接:推荐使用,但是要周期性的断开长连接
– 短链接
查询缓存
▪ 当执行查询语句的时候,会先去查询缓存中查看结果,之前执行过的sql语句及其结果可能以key-value的形式存储在缓存中,如果能找到则直接返回,如果找不到,就继续执行后续的阶段
▪ 但是,不推荐使用查询缓存:
– 1、查询缓存的失效比较频繁,只要表更新,缓存就会清空
– 2、缓存对应新更新的数据命中率比较低
分析器
▪ 词法分析:Mysql需要把输入的字符串进行识别每个部分代表什么意思
– 把字符串 T 识别成 表名 T
– 把字符串 ID 识别成 列ID
▪ 语法分析:
▪ 根据语法规则判断这个sql语句是否满足mysql的语法,如果不符合就会报错“You have an error in your SQL synta”
优化器
▪ 在具体执行SQL语句之前,要先经过优化器的处理
– 当表中有多个索引的时候,决定用哪个索引
– 当sql语句需要做多表关联的时候,决定表的连接顺序
– 等等
▪ 不同的执行方式对SQL语句的执行效率影响很大
– RBO:基于规则的优化
– CBO:基于成本的优化
mysql发送一个请求流程:
1 连接器提供链接服务的,做一些权限认证,比如说用户名和密码匹配
2 分析器分析sql语句,按照select from where等关键字进行切分,转成词法分析,最终变成AST(抽象语法树)
3 优化器有两种方式:RBO(基于规则优化)、CBO(基于成本优化)
4 执行器跟存储引擎进行数据交互
数据更新的流程:
1 执行器先从引擎中找到数据,如果在内存中直接返回,如果不在内存中,查询后返回
2 执行器拿到数据之后会先修改数据,然后调用引擎接口重新吸入数据
3 引擎将数据更新到内存,同时写数据到redo中,此时处于prepare阶段,并通知执行器执行完成,随时可以操作
4 执行器生成这个操作的binlog
5 执行器调用引擎的事务提交接口,引擎把刚刚写完的redo改成commit状态,更新完成
性能监控
show prodile(会被慢慢淘汰)
performance schema(性能模块)
show processlist