一、一条select语句的执行过程:
mysql 从大方面讲可以分为两部分,服务部分和存储引擎部分。
服务部分 包括 连接器,查询缓存,解析器,预处理器,查询优化器 ,查询执行引擎。
一条select 查询大致经过6个步奏:
1、客户端发起请求,首先建立连接
2、服务端会检查缓存,如果命中直接返回,否则继续
3、服务器根据收到的sql进行解析,然后对其进行词法分析以及预处理
4、由优化器生成执行计划
5、调用存储引擎层api执行查询
6、返回查询到的结果
具体点:
1、建立连接:mysql客户端和服务端的通信方式采用的是半双工协议 (数据双向传输但不能同时,like对讲机)。这就说明mysql简单快速,但是也限制了mysql 的性能,mysql单次传输数据包的大小可以通过参数max_allowed_packet控制,默认大小为4MB。
2、查询缓存:连接上了以后,如果缓存是打开的,那么就会进入查询缓存阶段,可以通过命令查看缓存是否开启SHOW VARIABLES LIKE 'query_cache_type';
缓存默认是关闭的。这是因为MySQL的缓存使用条件非常苛刻,是通过一个大小写敏感的哈希值去匹配的,这样就是说一条查询语句哪怕只是有一个空格不一致,都会导致无法使用缓存。而且一旦表里面有一行数据变动了,那么关于这种表的所有缓存都会失效。所以一般我们都是不建议使用缓存,MySQL最新的8.0版本已经将缓存模块去掉了。
3、解析器和预处理器 :
跳过了缓存模块之后,查询语句会进入解析器进行解析。
4、词法解析和语法解析:
这一步主要的工作就是检查sql语句的语法对不对,在这里,首先会把我们整个sql语句打碎,比如:select name from test where id = 1;就会比打散成8个字符,并且能识别出关键字和非关键字,然后根据sql 语句生成一个数据结构,也叫做解析树。
5、查询优化器:
...待完善