目录
逻辑架构图
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。
连接器
- 管理链接,权限验证
- 校验用户名密码
- 用户名密码校验通过后,连接器会到权限表里面查询出你拥有的权限并保存在一个变量里边以供查询缓存,分析器,执行器在检查权限的时候使用
- show processlist,可查看所有的会话链接
- 如果连接长时间没活动,连接器就会自动断开它,这里的“长时间”通过参数 wait_timeout 控制,默认 8 小时
- 执行语句的过程中临时使用的内存是管理在连接对象里面的,连接断开的时候会进行资源释放,如果长连接累计下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 mysql 异常重启了。所以要,定期断开长连接或者如果使用的mysql是5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不会导致连接重连和重新做权限验证
查询缓存
不建议全局开启查询缓存,因为只要有一个对表的更新,这个表上的所有查询缓存都会失效。
Mysql 提供了“按需使用”的方式,将 参数 query_cache_type 设置为 DEMAND ,查询sql加上 SQL_CACHE
select SQL_CACHE * from T where id = 10;
如果开启查询缓存,并select sql命中查询缓存,会在查询缓存返回结果的时候,做权限验证
注意,mysql8.0 版本直接将查询缓存的整块功能删掉了
分析器
词法分析,对输入的sql语句,识别出是查、是写还是DDL,识别出哪个字符串表示表名,哪些字符串表示字段。
语法分析,判断 sql 语句,是否符合 mysql 语法,如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒
最终构建解析树
优化器
生成执行计划,索引的选择,表连接的先后顺序
执行器
验证权限,是否有查指定表的权限,是否有写指定表的权限等(查询也会在优化器之前调用 precheck 验证权限)
调用引擎接口,结果返回