一、MySQL的执行流程
MySQL架构分为Server层、存储引擎,其中Server层又分为连接器、查询缓存、分析器、优化器执行器五个部分。当客户端发送请求后依次需要经过 处理请求、查询缓存、语法解析、查询优化、存储引擎部分。
1. 连接器
负责维持和管理连接,获取权限;如果连接长时间没有数据,连接器就会自动断开,参数wait_timeout控制,默认8小时。
2. 查询缓存
查询结果缓存一段时间,下次执行先查询缓存。MySQL8.0删掉了这个功能。
3. 分析器
对sql语句进行词法分析和语法分析
4. 优化器
优化器时在表里面有多个索引的时候,决定使用哪个索引,或者在一个语句有多表关联的时候,决定各个表的连接顺序。
5. 执行器
在执行SQL语句之前,执行器会进行权限检查,确保当前用户有足够的权限执行该操作。
执行器会根据表的存储引擎,使用这个存储引擎提供的接口。
6. 流程简述
当客户端通过TCP协议与MySQL服务器建立连接时,服务器首先进行身份验证。它将客户端传递过来的主机地址、账号、密码等信息与MySQL数据库下的user表中的数据进行比对。如果身份验证成功,客户端就被认为已经登录成功,否则服务器返回一条错误信息,拒绝登录。
一旦登录成功,当客户端向服务器发送一条SQL语句请求时,MySQL服务器会经历一系列步骤来执行这个请求。首先,SQL语句会经过解析器进行解析,包括词法解析和语法解析,生成一个语法树表示SQL语句的结构。
解析完成后,语法树会被送入优化器进行优化。优化器的任务是生成一个执行计划,即一种执行SQL语句的方式,它认为执行成本最低。这个执行计划描述了如何从表中检索数据、连接表、使用索引等操作。
生成了优化后的执行计划后,执行器接管执行过程。执行器首先检查用户是否具有执行该SQL语句的权限,如果没有权限,执行将被拒绝。如果有权限,执行器会调用存储引擎的API,与缓冲池或磁盘进行交互,最终获取并返回查询结果给用户。
需要注意的是,上述描述是基于MySQL 8.0版本之后的情况。在MySQL 8.0版本之前,服务器在返回结果时可能还会进行缓存。当下次继续发送相同的SQL语句时,MySQL会直接将SQL语句作为key,从查询缓存中获取结果,而不需要再经过解析器和后续的操作,提高了查询的速度。然而,在MySQL 8.0版本及之后,查询缓存机制已被废弃,不再推荐使用,因为在高并发环境下可能导致性能问题。