目录
1 客户端
2 服务端
2.1 Server层
2.1.1 连接器
2.1.2 查询缓存
2.1.3 词法器
2.1.4 优化器
2.1.5 执行器
2.2 存储引擎层
1 客户端
● 客户端为连接MySQL服务端的工具或者驱动,比如JDCB,ODBC等等
● 用于连接目前服务器,并且发送需要执行的SQL
2 服务端
2.1 Server层
● 负责处理SQL语句,解析优化,缓存等
● 提供权限管理,用户认证
● 提供了各种SQL函数和存储过程
● 提供了复制,备份,恢复等高级功能
● Server层有自己的日志系统,binlog日志
● binlog记录了所有的DML(INSERT,UPDATE,DELETE)语句
● binlog只要用于复制和恢复操作
2.1.1 连接器
● 负责接收客户端的连接
● 验证是否有权限登录
● 维护连接
● 默认异连接上的客户端空闲8小时后会被服务端主动断开
连接应该注意的问题
● 频繁创建和关闭连接可能会对性能产生负面影响,通常用连接池来管理数据库连接
● 使用长连接时,有可能会因为产时间运行导致MySQL服务端内存占用高未释放问题,可执行RESET CONNECTION命令重置mysql连接释放内存(本地使用MySQL8执行命令报错)
2.1.2 查询缓存
● MySQL5.7版本,查询时先查询缓存此语句是否执行过
● 之前执行的SQL语句会作为key,查询结果作为value存储在查询缓冲中
● 如果命中缓存,将直接返回查询结构
● 如果未命中,才真正执行查询逻辑
相关参数
● query_cache_size:用于缓存大小
● query_cache_type:设置使用缓存的场景
○ 0(OFF):不使用query cache
○ 1(ON):使用query cache
○ 2(DEMOND):查询时使用sql_cache参数才使用query cache
● MySQL8中去除了查询缓存机制
● 因为对于更新频发的表来说,缓存命中率会非常低
● 对于静态表,普遍上都会在业务层做缓存,不会使用到MySQL缓存数据
2.1.3 词法器
● 若查询缓存未命中,则会执行分析器来分析sql语句是否合法,主要进行词法分析和语法分析两个阶段
● 词法分析:
○ 主要负责从SQL语句中提取关键字,比如表名,字段名等等
○ 词法分析阶段从information_schema库中获取表结构信息
● 语法分析
○ 判断输入的语句是否满足MySQL语法
○ 如果语法错误,就会返回错误提示
● 在分析阶段也会对数据库的表级权限和数据库权限进行验证
2.1.4 优化器
● 经过了分析器,若语法正确,则会进入优化器
● 优化器的作用是查询重写,选择最佳执行路径,生成执行计划
● 查询重写:对原始的查询SQL进行重写,比如将子查询转换为join连接等
● 选择最佳执行路径:基于统计信息,选择使用哪个索引,确定表的连接顺序以及是否使用临时表,文件排序等策略
● 生成执行计划:基于以上分析,生成SQL执行计划,详细描述了如何从存储引擎获取数据,进行过滤,排序和聚合等操作
2.1.5 执行器
● MySQL通过分析器知道了你要做什么
● 通过优化器知道了该怎么做
● 通过执行器开始执行语句
打开表的时候,执行器就会根据标的引擎定义,去使用这个引擎提供的接口
● 调用引擎接口取这个表的第一行,判断是否满足条件,如果不是则跳过,如果是则将这行存在结果集中
● 调用引擎接口获取下一行,重复相同的判断逻辑,知道取到这个表的最后一行
● 执行器将上述遍历过程中所以后满足条件的行组成记录集作为结果返回给客户端
2.2 存储引擎层
● 负责数据的存储和检索
● MySQL支持多种存储引擎,比如InnoDB,MyISAM,Memory等等
● InnoDB是MySQL默认的存储引擎,支持事务,行级锁以及外键约束
● InnoDB有自己的日志系统,redo log(重做日志)和undo log(撤销日志)
● redo log用于保证事务的持久性
● undo log用于支持事务的原子性和多版本并发控制(MVCC)