背景
开发过程经常会遇到接口响应慢的问题,用户也会反馈页面卡顿,响应太慢,导致用户体验差,这个时候作为开发就要赶紧排查了,可能是程序处理的问题、也可能是并发量大导致排队问题、也可能是sql查询性能导致等;大多数时候sql查询缓慢是主要原因,下面我们聊下排查sql慢的思路。
技术简介
说到sql就要先了解下sql的架构图:
![](https://img-blog.csdnimg.cn/img_convert/d4dae649e93273cb4e5e1b58fd3e8a30.jpeg)
**客户端:**这里指连接MySQL各种形式,如.Net中使用的ADO连接、Java使用JDBC连接等,MySQL是客户端和服务器模式,前提先建立连接,才能传输数据,处理相关逻辑。
**业务逻辑:**在MySQL内部有很多模块组成,分别处理相关业务逻辑。
**连接管理:**负责连接认证、连接数判断、连接池处理等业务逻辑处理。
**查询缓存:**当一个SQL进来时,如果开启查询缓存功能,MySQL会优先去查询缓存,平时我们开发都会选择不开启。
**解析器:**对于一个sql语句,MySql根据语法规则需要对其进行解析,并生成一个内部能识别的解析树。
**优化器:**负责对解析器得到的解析树进行优化,MySQL会根据内部算法找到一个MySQL认为最优的执行计划,后续就按照这个执行计划执行。
**执行器:**得到执行计划之后,就会找到对应的存储引擎,根据执行计划给出的指令依次执行。
**存储引擎:**数据的存储和提取最后是靠存储引擎,平时我们使用最多的就是支持事务的InnoDb。
**物理文件:**数据存储的最终位置,即磁盘上,协同存储引擎对数据进行读写操作。
实现与效果
通过上面的逻辑我们知道一个sql发送到服务端时候要经过优化器,而使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql的即sql的执行计划。
![](https://img-blog.csdnimg.cn/img_convert/4f9427e4e60f466d80cfabc7de0832b5.png)