1.连接MySQL
通过客户端使用TCP(数据传输协议)连接MySQL连接器,连接器接到请求后对它进行检验是否有权限,有就进行分配资源。(这个过程不能超过8小时)
2.成功连接(校验效验)
客户端发送sql语句,MySQL拿到语句后,进行检验是查询语句还是修改语句,如果是select,在开启查询缓存的情况下,先在查询缓存中查找该SQL是否完全匹配,如果完全匹配,验证当前用户是否具备查询权限,如果权限验证通过,直接返回结果集给客户端,该查询也就完成了。如果不匹配继续向下执行。(注意:此步并不做词法及语法分析,也就是用不到分析器,这块原来我也很疑惑,如果不做分析mysql怎么知道我要查什么?解释如下:{MySQL将缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括了以下因素,即查询本身、当前要查询的数据库、客户端协议的版本等一些其他可能影响返回结果的信息。 当判断缓存是否命中时,MySQL不会进行解析查询语句,而是直接使用SQL语句和客户端发送过来的其他原始信息。所以,任何字符上的不同,例如空格、注解等都会导致缓存的不命中。} 其实说白了大概就是拿着你的SQL和原始缓存的SQL比对)
3.查询什么
如果在查询缓存中未匹配成功,则将语句交给分析器作语法分析,MySQL需要知道到底要查哪些东西,如果语法不对,就会返回语法错误中断查询。
4.分析器
分析器的工作完成后,将语句传递给预处理器,检查数据表和数据列是否存在,解析别名看是否存在歧义等。语句解析完成后,MySQL就知道要查什么了,之后会将语句传递给优化器进行优化(通过索引选择最快的查找方式),并生成执行计划。
5.执行
之后交给执行器去具体执行该语句,在执行之前,会先检查该用户是否具有查询权限,如果有,继续执行该语句。执行器开始执行后,会逐渐将数据保存到结果集中,同时会逐步将数据缓存到查询缓存中,最终将结果集返回给客户端。(缓存到查询缓存受到几个参数的影响 1.query_cache_type 是否打开查询缓存,默认为OFF 2.query_cache_size:查询缓存使用的总内存空间,默认值为1M 3.query_cache_limit 对于大于该值的结果集不会被缓存,默认值1M,在8.0版本后该参数被移除了)(如果该SQL执行过程中超过了慢查询阀值,该SQL会被记录到慢查询日志中)
这是对select语句的执行流程。