模块图
层次划分
Server层
含连接器/查询缓存/分析器/优化器/执行器等,所有跨存储引擎的功能都在此处实现,如存储过程/触发器/视图等。
连接器
连接时进行权限验证,且后续所有操作依赖连接时判定的权限。
长连接有时内存占用过快,因为MYSQL执行中临时内存管理在连接对象里,连接断开才会释放。如果累积下来,可能回导致内存过大OOM,现象MySQL异常重启。
解决方案:
- 定期断开长连接
- 程序执行过一个占用内存的大查询后,主动断开连接
- MySQL5.7及以上版本,可以执行mysql_reset_connection重新初始化连接资源,且不需要重连和重新权限认证,但连接会回到刚刚连接的状态。
- 回滚活跃的事务并重新设置自动提交模式
- 释放所有表锁
- 关闭或删除所有的临时表
- 重新初始化会话的系统变量值
- 丢失用户定义的设置变量
- 释放prepare语句
- 关闭handler变量
- 将last_insert_id()值设置为0
- 释放get_lock()获取的锁
- 清空通过mysql_bind_param()调用定义的当前查询属性
查询缓存
执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。但是查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。MySQL 8.0 版本删掉了查询缓存。
分析器
词法分析/语法分析,会判断表是否存在,列是否存在等。
执行器
判断对操作表有无执行权限 -> 打开表根据引擎定义使用对应接口。如select * from t where id = 1
,执行器回调用InnoDB引擎接口“获取第一行数据接口”,判断id值是否为10,是就存到结果集,否则跳过。然后继续调用“下一行数据接口”,直到最后一行,然后将结果集返回给客户端。
优化器
索引选择/join时驱动表选择
存储引擎层
存储数据,提供读写接口。架构模式为插件式,支持InnoDB/MyISAM/Memory等多个存储引擎,其中MySQL5.5.5版本后InnoDB成为默认引擎。
标签:语句,缓存,接口,查询,引擎,内存,SQL,执行,连接 From: https://www.cnblogs.com/kiper/p/17161966.html