mysql中,一条select语句是如何执行的?

本文深入解析MySQL查询执行过程,从连接器、查询缓存、分析器、优化器到执行器,详细介绍了每个组件的功能及工作原理。理解这些关键步骤对于优化SQL查询至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接下来通过语句弄明白整个Select语句的内部运行状态:

连接器:

Mysql>mysql -uroot -p

你首先连接到这个数据库上;链接器负责跟客户端建立连接,获取权限,维持和管理连接

      ●如果密码不对,你会收到“access denied for user”,然后客户端程序执行结束

      ●如果密码认证通过,连接器会从权限表里查出你的权限;之后你所有的操作都依赖于此时得到的权限

连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,sleep表明其处于空闲状态

客户端如果太久没动静,链接器会自动断开,默认时间8小时;wait_timeout参数控制

如果,连接断开,客户端再次发送请求后,会收到一个错误:“lost connection to mysql server during query”;这时候,你需要重新连接,然后再执行请求;

查询缓存:

一个select语句,会先到查询缓存中看看,若是以前执行过,直接将查询结果返回给客户端,若是查询缓存没有命中,就需要执行后面的计划

 

分析器

如果没有命中查询缓存,就要开始分析器了;

mysql> select sql_cache * from T where ID=10;

词法分析:比如,T识别为表,select识别为查询,ID识别为字段

语句分析:语法不对,会报错(5.5.5与8.0语法有些许不同)

优化器

经过分析器,mysql知道你要干什么了,在开始执行前,还要经过优化器的处理

优化器:在表里有多个索引的时候,决定使用哪个索引;在一个表里有多表关联时,决定各表的连接顺序;

很多时候,两种执行方法的逻辑结果是一样的,但是执行效率会有不同,而优化器就是决定选择哪个方案;

执行器

mysql> select sql_cache * from T where ID=10;

Mysql通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是进行了执行器阶段;

开始执行的时候,要先判断一下你对这个表T有没有查询的权限,如果没有,就会返回没有权限的错误:

“select command denied to user “”,for table T ”

如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口;

    ●调用innodb引擎接口取这个表的第一行,遍历所有的判断字段,如果满足,就将查询结果存在结果集

      你可以在rows_examined的字段,表示这个语句执行过程中扫描了多少行,这个值是累加的;

…………………………………………………………………………………………………………………………………………

内容来自于林晓斌老师《mysql实战45讲》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值