ITPub博客

首页 > 数据库 > MySQL > 小C的MySQL学习笔记(三):SQL语句的执行流程是怎么样的呢?

小C的MySQL学习笔记(三):SQL语句的执行流程是怎么样的呢?

原创 MySQL 作者:cg_gavin 时间:2019-02-06 15:17:35 0 删除 编辑

总的来说,MySQL逻辑架构可以分为server层和存储引擎层这两个部分。这篇文章记录的是SQL语句执行流程,主要是发生在server层上面的事。

server层主要包括了MySQL数据库大多数的功能,毕竟执行SQL大部分是在这一层去实现的嘛^_^。这一层细分下来可以分为:查询缓存(query cache 有的简称QC),解析器也可叫分析器,预处理器(其实也可以归在分析器里面),查询优化器等。

存储引擎层主要的工作是存储、提取数据。当前主要的存储引擎种类有:InnoDB,MyISAM,tokuDB等,他们的区别如下:

在InnoDB和MyISAM这两种存储引擎中,当前使用较广的是InnoDB,MyISAM由于不支持事务,不支持行锁等原因在8.0版本后已经被彻底废弃了。从MySQL5.5版本开始,InnoDB成为MySQL数据库默认的存储引擎。

先说结论吧,一条SQL语句从客户端发起后,到MySQL数据库,先会进行一系列验证(比如查询/更新权限),接着到查询缓存,再到解析器,查询优化器,完成执行语句的操作从存储引擎中调取结果返回给客户端。


一、连接&&验证权限

MySQL的连接主要有两种方式,一种是从服务器本地发起的,通过root用户,使用socket登录,还有一种是我们从客户端发起的属于远程连接,一般来说远程连接数据库通常需要输入的几个要素:用户名、密码、端口号、IP地址。

连接首先验证的是密码是否正确,当前用户在当前IP是否有权限登录等,登录完成后,该登录用户会具有当前已分配给他的权限(增删改查等)。


二、查询缓存

上一步的验证完成后,SQL执行就会来到查询缓存(query cache),看是否有执行过该SQL语句缓存有该SQL执行结果,如果有,直接取出结果返回给客户端,如果没有则进行下一步的查询。

不可否认,如果每次都能在查询缓存中获取数据,这个效率是很高的。但是对于 实际应用中,并不建议使用查询缓存。 因为查询缓存只能针对静态数据不能针对动态数据,很可能好不容易缓存好的数据,其中有表发生了更新,一下子缓存好的数据就被清掉了。而在8.0版本后,这功能也被彻底废弃了,在8.0之前的版本一般是建议关闭查询缓存功能的。


三、解析器

在第二步的查询缓存中没能获取或者说没能命中查询缓存,就会首先进行SQL解析,包含语法,语义解析:是要进行查询还是更新操作, 语句写的有没问题 之类的,生成一个解析树,提交给下一步。


四、预处理器(其实也可以归在解析器里面)

将第三步中解析过的解析树进行预处理,相对于第三部来说会进行更深层次的判断,比如 表/列是否存在之类的,会把解析树处理为更为平衡的平衡树结构。


五、查询优化器

预处理完成后,来到查询优化器,这里决定了比如走哪个索引等,转化前面的平衡树为执行计划,并选出一个数据库认为是最优的执行计划进行SQL的执行。


六、SQL执行

从存储引擎层调取需要的数据,返回给客户端,至此,流程结束。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31436737/viewspace-2578696/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
ORACLE 11G/12C OCM

注册时间:2017-02-20

  • 博文量
    5
  • 访问量
    2253