MySQL查询语句的内部执行流程

MySQL 由 Server 层和引擎层两部分组成。
Server 层包括连接器、查询缓存、分析器、优化器、执行器。
所有的内置函数(如日期、时间、数学和加密函数)、所有跨存储引擎(存储过程、触发器、视图)的功能都在这层实现。
存储引擎层负责数据的存储和提取。
支持 InnoDB、MyIsAM、Menory 等诸多存储引擎,MySQL 5.5.5 版本开始成为默认存储引擎

连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接。
1,连接建立后即使使用管理员账号修改了这个用户的权限,也不会影响已经存在的连接权限。只有再新建连接才会使用新的权限设置
2,MySQL 在执行过程中使用的内存管理在连接对象里,连接断开的时候才会释放,长连接累积下来,可能会导致内存占用太大
3,连接完成后,如果没有后续动作,这个连接就处于空闲状态,可以通过 show processlist 命令查看,command 显示为 “Sleep” 是空闲连接。
4,如果长时间没动静,连接器会自动断开连接,断开连接的默认时间为 8 小时,有参数 wait_timeout 控制。
5,连接有长连接和短连接,短连接是每次执行完很少的几次查询就断开连接,下次再重新建立一个,建立连接的过程比较复杂
,尽可能减少建立连接的动作,尽量使用长连接。
查询缓存:连接建立完成,执行逻辑就会进入查询缓存,执行结果已key-value的形式缓存在内存中。
1,查询缓存失效非常频繁,只要有对一个表的更新,这个表的所有查询缓存都会清空。
2,可以关闭查询缓存,query_cache_type 成 DEMAND,不使用查询缓存
3,可以显示制定使用查询缓存,SQL_CACHE
4,MySQL 8.0 版本中删除了查询缓存模块

分析器:对 SQL 语句做解析,知道要做什么
1,分析器执行步骤是先做词法分析,再做语法分析
2,词法分析是识别出 SQL 里面的字符串是什么
3,语法分析是根据语法规则判断这个 SQL 是否满足 MySQL 语法,语句不对会做错误提醒

优化器:在 SQL 开始执行之前要经过优化器的处理,知道怎么做
1,表里面有多个索引的时候,决定使用哪个索引
2,一个语句有多张关联表的时候,决定各个表的连接顺序

执行器:开始执行语句
1,执行器执行前,先做权限验证
2,如果命中查询缓存返回结果的时候,也要做权限验证
3,查询也会在优化器之前调用precheck验证权限
4,执行器会根据表的引擎定义,去使用这个引擎提供的接口

执行器执行的流程
1,查询语句没有索引、查询语句有索引是普通索引、查询语句有索引是唯一索引,三种执行方式有些差别
2,慢日志中 rows_examined 字段,标识这个语句执行过程中扫描了多少行,这个值就是执行器每次调用引擎获取数据行的时候累加的
3,引擎扫描行数跟 rows_examined 并不是完全相同。

猜你喜欢

转载自blog.51cto.com/1681189/2494685