目录

1. 流程图

2. 各个过程

2.1 连接器

2.2 分析器

2.3 优化器

2.4 执行器

2.5 注意点


1. 流程图

myql进阶-一条查询sql在mysql的执行过程-LMLPHP

2. 各个过程

假设我们执行一条sql语句如下:

select * from t_good where good_id = '1'

2.1 连接器

首先我们会和mysql建立连接,此时就会执行到连接器。

连接器的职责是负责和客户端建立连接、获取权限、维持和管理连接。

我们执行sql之前首先要和数据库建立连接。建立连接时如果我们的用户名和密码不正确,那么就会收到“"Access denied for user”的错误提示。

2.2 分析器

建立连接后,我们输入的sql传给mysql。mysql的分析器就开始对这条sql进行分析。

分析器包括词法分析和语法分析。

词法分析:根据输入的sql,识别出来这条sql是由什么字符串组成的,例如上边sql是由select 、from 、t_good等组成,通过词法分析可知这是一条查询语句。

语法分析:词法分析之后,语法分析器就会根据语法规则,判断这条sql是否符合语法。如果不符合语法就会给出相应的提示。

提示如下:

myql进阶-一条查询sql在mysql的执行过程-LMLPHP

这条语句我们把from写成了form,所以给了语法错误的提示信息。

2.3 优化器

优化器要做的事情是:决定这条查询语句如何执行。

例如:订单表中有多个索引,查询语句应该使用哪个索引进行查询。或者t1表联合t2表查询,到底先查询t1表的内容还是先查询出t2表中的内容呢?

而最终决定使用哪个索引或者哪种查询顺序是根据计算出来的cost来决定。

2.4 执行器

优化器决定了sql到底该如何执行,执行器就是负责按优化器的决定结果进行执行的。

2.5 注意点

查询缓存在mysql8.0版本已经去掉,此处并未提及。

查询缓存的原理:将已经执行过的语句及结果以key-value的形式进行存储,在分析器执行之前先查询是否有这个语句的缓存,如果有,那么执行返回结果。

查询缓存的实际效果:在实际的业务中我们的查询语句往往是动态,例如列表的多条查询,这会导致这个查询缓存的命中率很低。所以在生产环境不建议使用查询缓存。

01-14 00:03