mysql执行流程
2020-05-23 本文已影响0人
森林中大鸟
image.png
server层
包括 连接器,查询缓存,分析器,优化器,执行器等,所有内置函数,所有跨存储引擎的功能(存储过程,视图,触发器)
连接器
负责跟客户端建立连接,维持连接,管理连接,获取权限。
命令:
mysql -hport -u$user -p
命令执行流程:
- 创建tcp连接
- 输入用户名密码(密码也可以直接跟在-p后面,不推荐)
- 认证不通过执行结束;通过则读取用户权限(从权限表查询,后续该连接的权限判断都依赖此时读取的权限。即使权限被修改,对此连接来说,不会生效,需要重新建立连接才能使用新的权限)
- 连接超时后会自动断开由参数wait_timeout控制默认8小时
- 数据库一般使用长连接,SQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放,所以长连接可能会出现oom
可以定时断开连接。进行大内存大查询后断开连接。
MySQL 5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行
mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,
但是会将连接恢复到刚刚创建完时的状态
查询缓存
- 上次查询执行后会将sql语句和查询结果以k-v的形式存在缓存中,每次表更新会清除缓存。
- 适用于不常更新的表使用。可以显式指定使用缓存
mysql> select SQL_CACHE * from T where ID=10;
- MySQL 8.0版本直接将查询缓存的整块功能删掉
分析器
分析是否满足sql语法,不满足则报错并提示首次出现错误的地方。
优化器
从多个可选的执行方案中选择最优的执行方案
执行器
- 校验对表是否有权限
- 如果有,继续执行,操作引擎,返回结果
存储引擎
负责存取数据,插件式的架构,支持innodb(5.5之后默认的),myisam,memory等;建表时可以通过engine=memory指定。