作为一个资深CRUD boy,对于mysql想必都比较熟悉。但很多人估计和我一样对于一条简单的sql语句可以熟练的使用,但要问起里面怎么执行的,可能大部分分人就懵逼了。




SQL SERVER分析工具 sql server查询分析器在哪_SQL SERVER分析工具


因此本文就就将分析一下一条基本的sql语句内部是怎么执行的,以此让大家对sql的执行有一个基本的了解。注:本文针对mysql innodb引擎

mysql组成


SQL SERVER分析工具 sql server查询分析器在哪_sql更新语句_02

mysql组成架构图


从图中可以看出,其实mysql总体分为客户端、server端和引擎层三部分。

客户端

负责操作数据库进行各种业务

server端

server端主要包含以下几个部分:连接器、查询缓存、分析器、优化器、执行器

  • 连接器:要想操作mysql,首先需要建立一个连接,连接器主要负责跟客户端建立连接,获取权限,维持和管理连接。一旦一个连接已经建立,即使当前用户名,密码修改了,也不会影响已经建立的连接,只有当这个连接断开后才会使用新的用户名、密码。
  • 查询缓存:缓存大家应该都了解,主要用于加速处理,mysql的查询也添加了缓存,缓存开启关闭等设置可以通过query_cache_type参数进行设置。
mysql> SELECT @@query_cache_type; 
+--------------------+ | @@query_cache_type | 
+--------------------+ | ON | +--------------------+ 
query_cache_type有3个值 0代表关闭查询缓存OFF,1代表开启ON,2(DEMAND)代表当sql语句中有SQL_CACHE关键词时才缓存,
如:select SQL_CACHE user_name from users where user_id = '1';

如果开启了缓存,那么连接建立后,查询语句会首先去查询缓存里面查找是否有匹配的查询,如果有则直接把结果返回给客户端,没有找到则继续后面流程。可以看到缓存如果命中则可以节省很多过程,大大提升效率,但我这里其实并不推荐使用查询缓存。
缓存是需要更新的,mysql的查询缓存什么时候更新呢?当对表有更新操作的时候,mysql的查询缓存会全部删掉。由此可以看出,我们在使用mysql的时候更新操作是经常发生的,此时会把所有查询缓存清空,其实这样的话效率就会非常低。当然对于一些数据不怎么变动的表,如一些配置信息表,只是一些查询,很少有变更,使用缓存效率还是比较高的。具体要不要使用就根据自己的业务场景来判断了。Mysql8.0之后已经对查询缓存的功能整体移除掉了

  • 分析器:查询缓存没有匹配的话,就会开始接下来的查询流程。首先mysql需要分析一条语句的语法是否正确。selec * from user wehre id = 1; 如果语法错误,mysql会抛出相应的 You have an error in your SQL syntax; 错误。如果预发分析没有问题则会进入到后续流程。
  • 优化器:当已经确定了你的sql语句预发这些没有问题后,会接着对sql语句进行相应的优化,主要包括索引选用,join连接顺序等。mysql优化主要是基于成本分析做的,分析各种情况的成本最终决定查询方式。总之优化器会帮我们优化我们的sql语句,提升效率,但优化器的优化结果并不一定是最好的,有时候可能会和我们的预期不一致,此时就需要对sql进行相应的调整了。
  • 执行器:语句优化完成后,就需要真正执行语句了。执行器会首先判断用户是否有对当前表查询权限,没有权限返回相应错误,有权限才会打开表执行语句并返回对应结果。

引擎层

引擎层主要就是各种不同引擎提供相应的api来操作数据了。

一条sql的基本执行流程基本就是这样,如果有索引,过程也是一样的,只不过会先根据索引查询数据,然后查询满足要求的数据返回结果。

后面我会对sql更新语句、索引、redo log等各部分分别进行介绍。