一分钟弄懂MySQL查询语句执行过程!
想要学好一门技术,最基本的要求是摸清其原理和作用。学习MySQL也是如此,只有清晰的理解SQL语句执行的整个过程,才能更好的进行SQL的编写和优化。
平时我们使用最多SQL语句类型是DQL和DML,今天我们主要介绍的是查询语句。
首先,当MySQL收到一个请求时,它到底会如果执行?
- 客户端发送请求给MySQL Server层;
- Server层连接器会进行权限检查和连接管理等;
- 验证通过后先判断是否命中了缓存,如果是则返回缓存中的结果,否则继续执行;
- 解析器对SQL语句进行解析,生成对应解析树;
- 预处理器会进一步根据MySQL规则进行检查解析树是否合法,例如字段是否存在;
- 优化器将根据解析树生成最优(实际可能并不是)执行计划;
- 执行器调用存储引擎接口获取数据
MySQL基本架构
通过上图我们可以看出,Server层包括连接管理、权限验证、查询缓存、语法分析、查询优化等MySQL的核心服务功能,下面将一一介绍各个模块的功能。
连接器
主要负责建立连接和管理连接,校验用户权限等。
解析器
进行词法分析,语法分析后生成解析树。
预处理器
处理解析器无法分析的语义,检查用户对目标数据的权限等,生成新的解析树。
优化器
如同它的名字一样,它会尽可能选择最优的路径获取数据。
执行器
获取表的基础结构信息,根据不同的存储引擎调用对应接口获取数据。
要点总结
- 尽量不要使用Query cache,频繁的缓存失效会严重影响整体的性能,除非某个表执行DDL和DML的频率非常低。值得一提的是,MySQL 8.0版本已移除该功能;
- 优化器生成的执行计划不一定就是最优的,特别是存在多个索引可使用且数据分布不均匀的情况下。
了解了整体的执行流程之后,我们来看看查询语句的解析顺序。
SELECT语句解析顺序
通常来讲,我们一个查询语句会写成这样:
那么是不是就意味着程序会按照我们写的关键字顺序去执行,显然不是!
程序实际上是这么执行的:
大致分为以下三步执行:
第一步:确定从哪获取数据;
第二步:执行各种过滤条件;
第三步:选择符合条件的数据;
看出可以程序找到数据后会一步步进行过滤,最后只返回符合条件的记录,整个过程非常自然。
尾声
时间仓促,难免有所疏漏,但是希望你读完之后对于SQL查询过程有宏观的理解,如果有问题,欢迎在下方进行留言。
参考书籍:
- 《MySQL性能调优与架构实践》
- 《高性能MySQL》
请先 后发表评论~