MySQL执行一条SQL语句,涉及到以下几个过程:
1、客户端连接
要执行 SQL 语句,首先用户需要通过客户端连接到MySQL服务器,连接时需要指定用户名和密码,MySQL服务器中的连接器模块会对用户提供的用户名和密码进行验证,并检查用户是否拥有执行特定SQL语句的权限。一个用户成功建立连接后,即使管理员对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有新建的连接才会使用新的权限设置。
2、查询缓存
如果执行的是一条查询语句,MySQL会先到查询缓存中查找之前是不是执行过这条语句,如果能在缓存中找到,就直接返回查询结果。如果找不到,就继续往下执行。需要注意的是,如果一个表经常更新,查询缓存就会被频繁清空,导致缓存的命中率非常低,所以MySQL 8.0 版本后,查询缓存的功能被删掉了。
3、解析SQL
在执行某条SQL语句之前,MySQL需要先弄懂它的含义,所以需要解析器对 SQL 语句做解析。解析器首先会对SQL语句进行词法分析,也就是将SQL语句字符串中的关键字识别出来,比如select,from等等。接着解析器再根据词法分析的结果,对SQL语句进行语法分析构建出 SQL 语法树,方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。
4、执行SQL
在正式执行SQL之前,还会经过预处理和优化两个阶段。预处理阶段,预处理器会检查 SQL 语句中的表或者字段是否存在。优化阶段,优化器负责将SQL语句的执行方案确定下来,比如在表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。
经过优化器确定执行方案后,就由执行器真正开始执行SQL语句,执行器通过API与存储引擎交互,获取数据或对数据进行修改,并将执行结果返回给用户。
总结
MySQL执行一条SQL语句,会经过连接器处理客户端连接、查询缓存、解析器进行词法分析和语法分析生成语法树、预处理器检查表名和字段名、优化器确定最优执行计划以及最后执行器与存储引擎交互进行数据操作等多个流程。
原创 coderxiaozhi 编程十万问