sql语句执行过程

mysql架构总览

再看看一条select的语句的声明周期:

参考上面两张图来看sql的执行过程:

1、连接

SQL客户端与与服务器建立连接,该请求被发送到连接管理器,连接成功后会验证权限等,这过程其实就是一个TCP连接的过程。注意,MySQL服务器与客户端之间的通信是“半双工”的,意味着任意时刻,要么是服务器向客户端发送数据,要什么是客户端向服务器发送数据(请求),不能同时进行。
查看连接状态:SHOW FULL PROCESSLIST命令来查看MySQL正在做什么,如:

sleep:线程正在等待客户端发起新的请求
query:正在执行查询或者将数据返回给客户端
locked:该线程正在等待表锁(实现锁是在存储引擎中)
analyzing and statistics:线程正在收集存储引擎的统计信息,并生产相应的查询计划
copying to tmp table:线程正在查询,并将结果放到一个临时表中,这时候一般是在做group bu操作
sorting result:对结果集进行排序
sending data:线程可能在多个状态之间传递数据,或者正在生成结果集,或是在返回数据,有多种情况

2、查询缓存

如果查询命中缓存(一个大小写敏感的哈希查找实现的)则直接返回结果(注意:在返回结果前还会检查一次用户号的权限);如果查询没有命中缓存,则进行下一步sql解析。

3、语法解析器和预处理

首先通过mysql关键字将语句解析,会生成一个内部解析树,mysql解析器将对其解析,查看是否是有错误的关键字,关键字顺序是否正确;
预处理器则是根据mysql的规则进行进一步的检查,检查mysql语句是否合法,如,库表是否存在,字段是否存在,字段之间是否模棱两可等等,预处理器也会验证权限。

4、查询优化器

sql语句在优化器中转换成执行计划,一条sql语句可以有多种方式查询,最后返回的结果肯定是相同,但是不同的查询方式效果不同,优化器的作用就是:选择一种合适的执行计划
mysql是基于成本的优化器,他将预测执行此计划的成本,并选择成本最小的那条

5、执行计划

和很多关系型数据库不同的是,mysql不会产生查询字节码来执行查询,而是生成查询的一颗指令树,通过存储引擎执行指令并返回结果。最终的执行计划包含了重构查询的全部信息,通过EXPLAIN EXTENDED 和SHOW WARNINGS就可以看到重构的查询。
如图:一个四表关联

这是一颗平衡树,但这并不是mysql查询的方式,mysql总是从一张表开始一直循环嵌套,回溯完成所有的关联,如图:

6、执行SQL

在解析和优化阶段,MySQL将生成查询对应的执行计划,由执行计划调用存储引擎的API来执行查询MySQL执行(在此过程中只是简单的根据执行计划给出的指令逐步执行)
将结果返回给客户端;即使查询不需要返回结果,MySQL也会返回影响到的行数。注意:返回结果时是个逐步返回结果的过程,并不是一次性查询完然后返回一个大的结果集

原文链接:https://zhuanlan.zhihu.com/p/70295845

posted @ 2020-05-27 12:24  lanvce  阅读(422)  评论(0)    收藏  举报
//小火箭