SQL在MySQL中是如何执行的
MySQL内部结构
MySQL缓存
- 执行语句先到缓存中查询,如果查到,直接返回结果。(
当数据被更新后,缓存还是保存旧的值,但如果实时监控刷新缓存,对MySQL性能又有很大的影响。所以很鸡肋,所以MySQL@8之后已启用本地缓存 )
连接器
- 一个用户成功建立连接后,即使用管理员账号对这个用户的权限做个修改,也不会影响已经存在连接的权限。修改完成后,只有重新建立连接才能使用最新的权限设置。用户的权限表在系统表空间的mysql的user表中
- 客户端长连接事件默认为8h(可以调整)
问题: MySQL长连接有些时候会导致内存很大,从而导致OOM,该如何解决呢
- 如果是用MySQL@5.7或更高的版本,可以在每次执行一次比较大的操作后,同执行mysql_reset_connection来重新初始化连接资源。这个过程中不需要重连和重新做权限验证,但是会将连接回复到刚刚创建完时的状态。
分析器
- 分6个步骤完成对SQL语句的分析
- 词法分析
- 语法分析
- 语义分析
- 构造执行树
- 生成执行计划
- 计划的执行
优化器
- 比如:
select * from a join b on a.id = b.aid where a.name = 'xx' and b.name = 'xx' - 优化器经过成本计算,分析到底使用哪种索引效率更高,也就是说使用什么索引或者不要使用索引,都是优化器来决定
执行器
- 执行的时候要先判断一下这个表有没有执行查询的权限,如果没有就会返回没有权限的错误,(在工程的实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用precheck验证权限)
- 如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用引擎提供的接口
|