MySQL整体架构

目录

[1 客户端](#1 客户端)

[2 服务端](#2 服务端)

[2.1 Server层](#2.1 Server层)

[2.1.1 连接器](#2.1.1 连接器)

[2.1.2 查询缓存](#2.1.2 查询缓存)

[2.1.3 词法器](#2.1.3 词法器)

[2.1.4 优化器](#2.1.4 优化器)

[2.1.5 执行器](#2.1.5 执行器)

[2.2 存储引擎层](#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)

相关推荐
A__tao2 小时前
一键将 SQL 转为 Java 实体类,全面支持 MySQL / PostgreSQL / Oracle!
java·sql·mysql
一只fish2 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(17)
数据库·mysql
叁沐4 小时前
MySQL 06 全局锁和表锁:给表加个字段怎么有这么多阻碍?
mysql
power 雀儿5 小时前
集群聊天服务器---MySQL数据库的建立
服务器·数据库·mysql
Edingbrugh.南空7 小时前
Flink MySQL CDC 环境配置与验证
mysql·adb·flink
BD_Marathon8 小时前
Ubuntu:Mysql服务器
服务器·mysql·ubuntu
程序猿小D8 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的电影小说网站管理系统,推荐!
java·数据库·mysql·spring·毕业设计·ssm框架·电影小说网站
羊小猪~~8 小时前
数据库学习笔记(十七)--触发器的使用
数据库·人工智能·后端·sql·深度学习·mysql·考研
叁沐9 小时前
MySQL 05 深入浅出索引(下)
mysql
陈卓41010 小时前
MySQL-主从复制&分库分表
android·mysql·adb