MySQL基础架构
从一条查询sql了解架构示意图
select * from T where ID = 10;
简图

下面从两方面介绍架构关系
Server层
Server层包括连接器、查询缓存、分析器、优化器、执行器这些组件,以及其他的内置函数,存储过程、触发器、视图都在这一层实现
连接器
连接器负责和客户端建立连接、获取权限、维持和管理连接。常用命令如下
mysql -h$ip -P$port -u$user -p
连接器会认证输入的用户名和密码
- 如果认证不通过,服务器会返回"Access denied for user"的错误
- 如果认证通过,连接器会到权限表查询相应权限;此后这个连接的权限判断都依赖此时读取到的内容,即使后续被调整了权限,也只有重新登录后才会生效
- 连接后如果没有操作,连接器会自动断开,这个参数由wait_timeout控制,默认是28800秒(8小时)
这里涉及到一个长连接和短连接的问题
- 长连接是指连接成功后,持续有请求,就会一直使用这个连接
- 短连接是指每次连接后,执行少数几次查询就断开连接
通常使用的话一般建议使用长连接,但是这会导致MySQL占用内存快速增长,而且只有在断开连接时才会释放资源;如果处理不当,会导致MySQL被系统杀掉(OOM)
查询缓存
- mysql接收一个查询请求,会首先在查询缓存查到对应的数据;查询缓存存储的方式以 查询语句和结果作为 key-value缓存在内存中
- 但是不推荐使用查询缓存,因为查询缓存失效频率非常高;原因是,表中有一条数据更新,这个表上所有的查询缓存会全部被清除,所以非归档库或者配置库不建议使用
- mysql 8.0后取消了查询缓存的功能
分析器
请求没有命中查询缓存,会进入分析器进行分析,主要包括词法分析和语法分析
- 词法分析:mysql会识别sql语句中字符串代表的含义,区分关键字 select,表名,列名等
- 语法分析:按照语法规则检查输入的语法是否满足,语法错误的话会提示报错
优化器
分析器分析完sql语句后,要经过优化器的处理后再执行,大原则是:尽量扫描少的数据库记录行数
- 表里有多个索引时,选择其中一个索引
- 有多个表连接(join)时,决定表的连接顺序
执行器
执行器负责语句真正的执行,但是在执行前会进行precheck权限验证以及缓存查询,如果对表有操作权限以及没有命中缓存,则会进入以下执行流程
案例:select * from T where ID = 10;
- 调用表的引擎接口获取第一行,判断ID是否为10,如果是,放入结果集,如果不是,接跳过;
- 调用引擎获取下一行,重复相同的判断,知道表的最后一行 (对于有索引的表,区别在于获取的数据是满足条件的第一行,后续是调用满足条件的下一行接口)
- 将结果集返回客户端
存储引擎层
存储引擎负责数据写入与读取,支持innoDB、myISAM、Memory等多种引擎类型;mysql在5.5.5版本后默认支持innoDB
内容参考 极客时间-林晓斌《MySQL实战45讲》
学习参考链接 http://gk.link/a/12eC1

浙公网安备 33010602011771号