大家好,我是风济海。
在了解了MySQL的架构之后,再看“一条查询SQL是如何执行的”这个问题也就很清晰了,执行流程如下图:
一、用户通过客户端或应用服务器与MySQL服务器(默认端口3306)建立连接,在MySQL服务器的连接池进行身份(用户名密码或SSL证书)和角色的权限(比如表权限)验证,验证通过后会把连接管理起来。
延伸:我们一般使用的是同步长连接的方式与MySQL交互。以下指5.7版本的MySQL。默认的连接超时时间是8小时,可通过以下命令查看:
show global variables like 'interactive_timeout';--交互式超时时间,如数据库连接工具
默认的最大连接数是151个(最大可调成16384),可通过如下命令查看:
show variables like 'max_connections';
二、MySQL先查询缓存,如果MySQL开启了缓存,且已经有这条语句的缓存,则直接返回对应结果,否则,执行下面的流程。
延伸:5.7版本的MySQL的查询缓存默认是关闭的,可通过如下命令查看:
show variables like 'query_cache%';--query_cache_type=OFF
三、解析器,首先对SQL语句进行词法分析,识别每个字符串代表什么。然后进行语法分析,并根据语法规则生成解析树。预处理器会对解析树进行进一步的验证和处理,比如表名、字段名是否正确。在这一流程中如果发现有错误,则直接返回错误;否则,执行下面的流程。
四、查询优化器根据解析树,并基于开销最小的原则,生成最优的查询执行计划。
延伸:可以在查询语句前加上explain获取执行计划,查看索引的使用情况、是否是全表扫描等。优化器能处理那些优化类型?1)有多个索引可以使用时,选择使用哪个索引;2)多表关联查询时,以哪个表的数据作为基准表;3)子查询的优化;4)条件化简;5)连接的消除;6)语义优化等等。
五、执行引擎根据执行计划,来调用存储引擎层的API,执行查询操作,获取相应的数据并返回,如果MySQL开启了查询缓存,查询结果会被放到缓存中,并响应客户端。
以上便是一条查询SQL语句的执行流程了。