MYSQL独孤九剑(一)查询语句是如何执行的?

微信搜索在下uptown

 

​    昨天就该更的,跟高中挚友进行完每周一鸡后聊到了快一点,这厮学心理学学的颇有些看破红尘的意思,事情还是别看太透了,怪吓人的。上午看了一下这就是街舞,不说了DJ drop the beat。

    痛定思痛这周起开一个MYSQL系列文章,以免之后不知道更啥,不管有没有人看,自己也能学到更多东西~我们从网页上看到各种数据归根结底都会落盘到数据库中,那么sql就是用来操作数据库管理系统,对数据库表数据进行增删改查。通常在数据库中输入一条sql我们看到的只是输入一条语句,返回一个结果集,却不知道这条语句在MySQL内部的执行过程。举一个最简单的例子:

   select * from T where ID=10;

大体来说,MySQL可以分为Server层和存储引擎层两部分。Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等)。存储引擎层负责数据的存储和传输,常见的引擎有InnoDB、MyISAM、Memory等多个存储引擎。每个引擎支持的功能互不相同,现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。可以在创建表的时候使用engine=memory手动指定对应引擎。

MYSQL独孤九剑(一)查询语句是如何执行的?_第1张图片

                    (参考极客时间)

连接器

    首先要跟数据库服务进行连接,那么就要与连接器进行交互,输入连接命令

mysql -h$ip -P$port -u$user -p,在完成经典的TCP握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。也就是说,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数wait_timeout控制的,默认值是8小时。建立连接的过程通常是比较复杂的,尽量使用长连接。但是长连接太多会导致MYSQL内存占用太大,导致死机重启。

查询缓存

 

    连接建立完成后,就可以执行查询sql语句了。来到第二部,查询缓存。MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。如果在缓存中找到key,那么直接返回value给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。但在MYSQL8.0中缓存被删除了。

分析器

    到了这一步开始真正执行sql,首先要知道想干什么,所以对sql进行"词法解析",比如从输入的"select"这个关键字识别出来,这是一个查询语句。它也要把字符串“T”识别成“表名T”,把字符串“ID”识别成“列ID",做完了这些识别以后,就要做“语法分析”。根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。如果你的语句不对,就报错“You have an error in your SQL syntax”没少见了

优化器

    优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。比如你执行下面这样的语句,这个语句是执行两个表的join:

  select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

  • 既可以先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20。

  • 也可以先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否等于10。

这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。

执行器

    开始执行的时候,要先判断一下你对这个表T有没有执行查询的权限,如果没有,就会报错。回到刚才的例子ID字段没有索引,那么执行器的执行流:

  1. 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;。

  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

  3. 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,这个语句就执行完成了。

 

MYSQL独孤九剑(一)查询语句是如何执行的?_第2张图片

 

微信搜索在下uptown

你可能感兴趣的:(MYSQL独孤九剑(一)查询语句是如何执行的?)