MySQL基础架构

从一条查询sql了解架构示意图

select * from T where ID = 10;

简图

下面从两方面介绍架构关系

Server层

Server层包括连接器、查询缓存、分析器、优化器、执行器这些组件,以及其他的内置函数,存储过程、触发器、视图都在这一层实现

连接器

连接器负责和客户端建立连接、获取权限、维持和管理连接。常用命令如下

mysql -h$ip -P$port -u$user -p

连接器会认证输入的用户名和密码

  1. 如果认证不通过,服务器会返回"Access denied for user"的错误
  2. 如果认证通过,连接器会到权限表查询相应权限;此后这个连接的权限判断都依赖此时读取到的内容,即使后续被调整了权限,也只有重新登录后才会生效
  3. 连接后如果没有操作,连接器会自动断开,这个参数由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;
  1. 调用表的引擎接口获取第一行,判断ID是否为10,如果是,放入结果集,如果不是,接跳过;
  2. 调用引擎获取下一行,重复相同的判断,知道表的最后一行 (对于有索引的表,区别在于获取的数据是满足条件的第一行,后续是调用满足条件的下一行接口)
  3. 将结果集返回客户端

存储引擎层

存储引擎负责数据写入与读取,支持innoDB、myISAM、Memory等多种引擎类型;mysql在5.5.5版本后默认支持innoDB

内容参考 极客时间-林晓斌《MySQL实战45讲》
学习参考链接 http://gk.link/a/12eC1

posted @ 2023-12-12 15:32  for坚持ret胜利  阅读(5)  评论(0)    收藏  举报