首页 > 数据库 >SQL语句执行过程

SQL语句执行过程

时间:2023-02-27 22:44:07浏览次数:41  
标签:语句 缓存 接口 查询 引擎 内存 SQL 执行 连接

模块图

image

层次划分

Server层

含连接器/查询缓存/分析器/优化器/执行器等,所有跨存储引擎的功能都在此处实现,如存储过程/触发器/视图等。

连接器

连接时进行权限验证,且后续所有操作依赖连接时判定的权限。

长连接有时内存占用过快,因为MYSQL执行中临时内存管理在连接对象里,连接断开才会释放。如果累积下来,可能回导致内存过大OOM,现象MySQL异常重启。

解决方案:

  1. 定期断开长连接
  2. 程序执行过一个占用内存的大查询后,主动断开连接
  3. 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

相关文章