时点是什么意思| 开悟是什么意思| 羊水是什么味道| 后话是什么意思| 不饱和脂肪酸是什么意思| 三月四号什么星座| vsc是什么意思| 足贴为什么变黑出油| 什么的枝叶| 27虚岁属什么生肖| 2021是什么年| 局长是什么级别| 双肺结节是什么病| 榴莲什么样的好吃| 冰释前嫌的释是什么意思| 如果你是什么那快乐就是什么| 长命百岁的动物是什么| 皮蛋是什么蛋做的| 阑尾是什么器官| 动物的脖子有什么作用| 今年闰六月有什么说法| 咖啡有什么好处和坏处| 共济失调是什么病| scr是什么意思| 幽门螺杆菌阳性吃什么药| c代表什么| 螃蟹为什么横着走| 万什么一心| 阿莫西林治什么病| 地方是什么意思| 做了胃镜多久可以吃东西吃些什么| 天衣无缝什么意思| 阴部痒痒的是什么原因| 申是什么生肖| 蚊虫叮咬用什么药| 青春痘长什么样| 拉尼娜现象是什么| 粉色是什么颜色配成的| 枯草芽孢杆菌治什么病| 依稀是什么意思| 什么食物含有维生素b| 白子画什么时候爱上花千骨的| ph值低是什么原因| 61岁属什么| 11.5是什么星座| nf是什么单位| 跟腱炎吃什么药效果好| 什么是静息心率| 花生不能和什么食物一起吃| 电子烟有什么危害| 吊龙是什么| 与世隔绝的绝是什么意思| 低血压是什么意思| 过年给老人买什么| 儿童尿路感染吃什么药| 贵人命是什么意思| 复方氯化钠注射作用是什么| 三月十九是什么星座| 新生儿什么时候能看见东西| 良字少一点是什么字| 9月三号是什么日子| 什么情况下需要安装心脏起搏器| 同房时间短吃什么药| 老实的动物是什么生肖| 石加乏念什么| 赤者念什么| 宝宝便秘吃什么好| 做nt需要做什么准备| 宛如是什么意思| 小针刀是什么| 多多益善的益是什么意思| 腰困是什么原因| 蓝色妖姬的花语是什么| 什么的沙滩| 梦见自己化妆是什么意思| 幽门梗阻是什么意思| 六月六日是什么日子| 女人气虚吃什么补最快| 老是流眼泪是什么原因| 请佛像回家有什么讲究| 盆腔炎做什么检查能查出来| 更年期综合征吃什么药| 腰疼做什么检查| 什么是脑卒中| giuseppe是什么牌子| 细胞学说揭示了什么| 腰椎间盘突出吃什么药好| 达克宁栓治疗什么妇科病| 钟字五行属什么| 前置是什么意思| 魑魅魍魉什么意思| 一什么港湾| 什么叫血沉| 西瓜适合什么土壤种植| 咳嗽吃什么食物好| 好文采是什么意思| 牙龈黑紫色是什么原因| 痰多是什么原因造成的| 仲夏夜是什么意思| ldlc是什么意思| 吉可以加什么偏旁| 玉兰花什么时候开| 双侧骶髂关节致密性骨炎是什么病| 彩棉是什么面料| 男性尿很黄是什么原因| 三摩地是什么意思| 嗜是什么意思| 为什么一直打哈欠| 拔火罐有什么好处| dia是什么意思| 4月26是什么星座| 儿童口腔疱疹吃什么药| 马踏飞燕什么意思| 左侧卵巢多囊样改变什么意思| 三丧日是什么意思| 吃什么能增肥| 狮子座后面是什么星座| 梦见捞鱼是什么意思| 肺结节不能吃什么| 手脱皮是什么原因| 12月18号是什么星座| 溴隐亭是什么药| 结婚五周年是什么婚| 火烧云是什么意思| 霉菌性阴道炎有什么症状| 眼镜轴位是什么意思| 什么颜色加什么颜色等于什么颜色| 梦见自己掉头发是什么征兆| 视力模糊用什么眼药水| 吃蒲公英有什么好处| 慢性肠炎有什么症状| iga肾病是什么意思| 南京有什么特色特产| 去医院看心理挂什么科| 宇宙的外面是什么| 或是什么意思| 吃芒果过敏吃什么药| 请问紫苏叶有什么功效| 猫不能吃什么| 骨加后念什么| 得五行属什么| 1986年属什么生肖| jennie什么意思| 蛇鼠一窝什么意思| 梦见红薯是什么意思| 喝啤酒有什么好处| 沾沾喜气什么意思| 为什么会长斑| 男性生殖器叫什么| 白醋洗脸有什么好处| 鼻子经常出血是什么病征兆| 肚子一直响是什么原因| 梦到女孩子有什么预兆| 黛是什么颜色| hpv挂什么科| 小孩睡觉张开嘴巴是什么原因| 手发麻发木是什么病的前兆| cep是什么意思| 阴茎插入阴道什么感觉| 左手无名指戴戒指什么意思| 梗米是什么| 隔岸观火是什么意思| 百草枯什么味道| 孕妇吃辣椒对胎儿有什么影响| 鼻炎不能吃什么| snr是什么意思| coscia是什么品牌| 什么病不能吃西兰花| 口腔炎吃什么药| 1960年属鼠的是什么命| 单亲是什么意思| 什么是天珠| 淡盐水有什么作用和功效| 信徒是什么意思| 带手串有什么讲究| 济公叫什么名字| 螃蟹吃什么食物| 卵巢囊性结构是什么意思| 卡西欧手表什么档次| 脂蛋白a是什么意思| 两个c交叉是什么牌子| plcc是什么意思| 肿瘤是什么病严重吗| 哲五行属什么| momo是什么意思| 平和是什么意思| 同舟共济什么意思| 春秋是什么时期| 早上起来口苦是什么原因| 直销是什么意思| 哮喘是什么症状| 打喷嚏流鼻涕吃什么药好| 地球是什么星| 你什么我什么成语| 10.28是什么星座| 激光脱毛和冰点脱毛有什么区别| 仓鼠是什么动物| 一个入一个肉念什么| 房颤有什么危害| 1206是什么星座| 半月板退变是什么意思| 梦见自己孩子死了是什么意思| 乳腺结节3类什么意思| 护士资格证什么时候考| 属兔的婚配什么属相好| 跪安是什么意思| 颈椎看什么科| 束脚裤配什么鞋子| 视力5.3是什么概念| 岐黄是什么意思| 尿液臭味很重什么原因| 单核细胞高是什么感染| 宽字五行属什么| 梦见买房子是什么预兆| 梦见干活是什么意思| pfs是什么意思| 五指毛桃长什么样| 食物中毒吃什么解毒最快| 豕是什么动物| 象牙塔比喻什么| 山羊吃什么| 什么样的脚好看| 梦见买猪肉是什么预兆| 胎儿畸形是什么原因造成的| hp感染是什么病| 梦见什么是受孕成功了| navigare是什么牌子| 一步两步三步四步望着天是什么歌| 昙花有什么功效与作用| 氯吡格雷治什么病| 一落千丈是什么生肖| 两个夫一个车是什么字| 蚕屎做枕头有什么好处| 口吃是什么意思| 血小板压积偏高是什么原因| 肝血管瘤挂什么科| 阴囊湿疹用什么药效果最好| 女人耳垂大厚代表什么| 坚果是什么| 色弱什么意思| 头发长得慢是什么原因| 男人吃什么食物可以补肾壮阳| 劳伦斯属于什么档次| 魔术贴是什么| 11月20号是什么星座| charleskeith什么牌子| 线束是什么意思| 嫣然是什么意思| 净身出户是什么意思| 吃什么降尿酸最有效| 44岁属什么| 职业测试你适合什么工作| 物以类聚人以群分什么意思| 感冒为什么会流鼻涕| 存货是什么| 稀奶油可以做什么| ptsd是什么意思| 冠脉cta主要检查什么| 洁颜油是干什么用的| 湿气重有什么表现| 一月2日是什么星座| 什么是包皮过长| 做梦梦见捡钱是什么意思| swisse是什么药| 百度

波拉波拉水上泳池别墅 落座阳光甲板欣赏泻湖美景

数据库 MySQL
在介绍select语句在MySQL中的执行流程之前,我们先来看看MySQL的逻辑架构,因为任何SQL语句的执行都离不开MySQL逻辑架构的支撑。也就是说,SQL语句在MySQL中的执行流程与MySQL的逻辑架构是密不可分的。
百度 钟期从营销策划、财务管理起步,创立了惠州百业咨询策划有限公司。

MySQL作为互联网行业使用最多的关系型数据库之一,与其免费、开源的特性是密不可分的。然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多年后,想跳槽进入大厂,却在面试的时候屡屡碰壁。

问个简单的问题:select语句是如何在MySQL中执行的? 这也是很多面试官喜欢问的问题,如果你连这个简单的问题都不能回答的话,那就要好好规划下自己的职业生涯了。

好了,今天我们就一起来聊聊select语句是如何在MySQL中执行的。文章的主要内容如下。

图片图片

频繁使用的select语句

为了更好地贯穿全文,这里先来列举一个最简单的select查询语句,例如:查询user表中id为1001的用户信息,使用下面的SQL语句进行查询。

select * from user where user_id = 1001;

当我们在MySQL的命令行中输入上述SQL语句时,这条SQL语句到底在MySQL中是如何执行的呢?接下来,我们就以这条SQL语句为例,说说select语句是如何在MySQL中执行的。

MySQL逻辑架构

在介绍select语句在MySQL中的执行流程之前,我们先来看看MySQL的逻辑架构,因为任何SQL语句的执行都离不开MySQL逻辑架构的支撑。也就是说,SQL语句在MySQL中的执行流程与MySQL的逻辑架构是密不可分的。

图片图片

在上图中,我们简单的画了下MySQL的逻辑架构图,并且给出了逻辑分层和每层中各部分的功能。从逻辑上,我们可以将MySQL粗略地分成三层:Server层、存储引擎层和系统文件层,而Server层中又可以分成网络连接层(连接器)和数据服务层(Server层)。

Server层中包含了连接器、查询缓存、分析器、优化器和执行器等MySQL的核心组成部分,另外,在Server层中还包含了所有的内置函数(比如:日期时间函数、加解密函数、聚合函数、数学函数等),存储引擎、触发器、视图等等。

存储引擎层主要负责和系统文件层进行交互,存储引擎层本身是插件式的架构设计,支持InnoDB、MyISAM、Archive、Memory等存储引擎。在MySQL 5.5.5及以后的版本中,MySQL的默认存储引擎是InnoDB。

系统文件层主要负责存储实际的数据,将数据以文件的形式存储到服务器的磁盘上。

接下来,我们就来说说一条select语句在MySQL的逻辑架构的每一部分到底是如何执行的。

连接器是如何授权的?

首先,我们先来看看在服务器命令行输入连接MySQL的命令时,MySQL的连接器是如何进行验证的。比如,我们在服务器的命令行输入了如下命令。

mysql -ubinghe -p

执行“回车”后,输入binghe账户的密码,与MySQL进行连接。此时,连接的过程需要完成经典的TCP握手操作(有关TCP的握手相关的知识,小伙伴们可以参考《【面经】面试官:讲讲七层网络模型与TCP三次握手与四次断开?》)。之后,连接器就开始认证连接的身份是否合法,最直接的就是验证用户名和密码是否正确。

如果用户名或者密码错误,MySQL会提示 Access denied for user。如果用户名和密码正确,则连接器会到MySQL的权限表中查询当前连接拥有的权限。查询到权限之后,只要这个连接没有断开,则这个连接涉及到的权限操作都会依赖此时查询到的权限。

换句话说,一个用户登录MySQL并成功连接MySQL后,哪怕是管理员对当前用户的权限进行了修改操作,此时只要这个用户没有断开MySQL的连接,就不会受到管理修改权限的影响。管理员修改权限后,只有对新建的连接起作用。

如果客户端连接MySQL后,长时间没有执行任何操作,则连接器会自动断开与这个客户端的连接。具体多长时间断开是由MySQL的参数wait_timeout控制的,这个值默认是8小时。我们可以根据实际业务需要,自行调整这个参数的值,以使MySQL能够满足我们的实际业务场景。

由于客户端与MySQL的连接是比较复杂的,这个过程也是比较耗时的,它会涉及TCP的握手操作,还会查询当前连接的权限信息等。往往在实际的工作过程中,我们会使用数据库连接池的方式,将数据库的连接缓存起来,这就意味着我们是使用长连接与MySQL进行交互的。

但是使用长连接连接MySQL也会有一个问题:那就是有时候会发现MySQL占用的内存涨得特别快,这是因为MySQL在执行的过程中,使用的临时内存是在连接对象里面进行管理的。这些占用的资源只有在连接断开的时候,才会被释放。如果连接长时间不释放,就会出现大量的临时内存占用内存空间。如果时间久了,可能会导致占用过多的内存,从而被操作系统“消灭”了,给人的感觉就是MySQL意外重启了。

我们可以使用如下的方案来解决这个问题:

  • 定期或者执行过一个比较占内存的查询操作后,断开连接,以后再重新建立和MySQL的连接。
  • 如果使用MySQL 5.7或更新的MySQL版本,可以通过执行mysql_reset_connection重新初始化MySQL的资源。重新初始化的过程不会重新连接MySQL,也不会重新做权限的验证操作。

查询缓存的作用是什么?

登录MySQL后,客户端就会与MySQL建立连接,此时执行select语句时,首先会到查询缓存中查询是否执行过当前select语句。如果之前执行过相应的select语句,则执行过的select语句和查询结果会以key-value的形式存放在查询缓存中,其中,key是查询语句,value是查询的结果数据。

如果在查询缓存中没有找到相应的数据,则会继续执行后续的查询阶段。执行完成后,会将结果缓存到查询缓存中。后续的查询如果命中缓存,则直接返回查询缓存中的数据,性能还是挺高的。

但是,大多数时候我不太建议小伙伴们开启查询缓存,为啥?原因很简单:查询缓存失效的频率是非常频繁的,只要对一个表进行更新操作,则这张表上所有的查询缓存都会被清空。 而且在MySQL 8.0中,直接删除了查询缓存的功能(冰河在看MySQL源码时,也证明了这一点)。

分析器对select语句做了什么?

分析器主要是对select语句进行 词法分析和语法分析 操作。

如果select语句没有命中缓存,则首先会由分析器对其进行“词法分析”操作,此时,MySQL会识别select语句中的每个字符串代表什么含义。

例如,MySQL会通过"select"关键字识别出这是一个查询语句,也会把"user"识别为"数据表名user",把"id"识别成"字段名id"。接下来,就要进行“语法分析了”,根据语法规则,判断select语句是否满足MySQL的语法。如果判断出输入的SQL语句不满足语法规则,则MySQL会提示相应的错误信息。

优化器是如何优化select语句的?

对select语句进行了词法分析和语法分析后,还要经过优化器的优化处理才能执行。比如,我们的select语句中如果使用了多个索引,则优化器会决定使用哪个索引来查询数据;再比如,在select语句中,有多表关联的操作,优化器会决定各表的连接顺序,数据表的连接顺序不同,对于执行的效率会大不相同,优化器往往会选择使用查询效率高的连接顺序。

如果select语句经过优化器的优化之后,就会进入执行阶段了。

执行器如何执行select语句?

进入执行阶段的select语句,首先,执行器会对当前连接进行权限检查,最直接的方式就是检查当前连接是否对数据表user具有查询权限。如果当前连接对数据表user没有查询权限,就会返回没有权限的错误。例如,会返回如下错误。

ERROR 1142 (42000): SELECT command denied to user 'binghe'@'localhost' for table 'user'

如果当前连接具有对数据表user的查询权限,则会继续执行。首先会进行打开数据表的操作,此时优化器会根据创建表时使用的存储引擎,使用相应存储引擎的接口执行查询操作。这里,我们举一个例子:

假设,我们在id字段上没有建立索引,执行器执行的流程大致如下所示。

(1)通过存储引擎读取数据表user的第一行数据,判断当前行的id值是否等于1001,如果不等于1001,则继续读取下一行数据;如果等于1001,则将当前行放入结果集中。

(2)继续通过存储引擎读取下一行数据,执行与(1)相同的逻辑判断,直到处理完user表中的所有数据。

(3)处理完所有的数据后,执行器就会将结果集中的数据返回给客户端。

如果在id字段上有索引的话,执行的整体逻辑与id字段上没有索引大体一致。

如果开启了慢查询的话,执行select语句时,会在慢查询日志中输出一个rows_examined字段,这个字段表示select语句在执行的过程中扫描了数据表中的多少行数据。不过在有些场景下,执行器调用一次,存储引擎内部会会扫描多行,这就导致存储引擎扫描的行数与rows_examined字段标识的行数并不完全相同。

责任编辑:武晓燕 来源: 冰河技术
相关推荐

2025-08-05 07:32:40

InnoDBMySQL引擎

2025-08-05 09:24:55

2025-08-05 15:13:21

网络

2025-08-05 08:17:38

2025-08-05 08:22:51

Figma图形编辑变换矩阵

2025-08-05 15:58:11

2025-08-05 08:55:12

工业物联网IIoT

2025-08-05 09:30:25

Figma矩形矩形物理属性

2025-08-05 08:30:12

程序员男友感受

2025-08-05 10:37:59

服务器故障优化

2025-08-05 08:52:36

Java JVM多态

2025-08-05 06:20:02

Linux日志文件系统

2025-08-05 08:54:24

2025-08-05 09:13:11

索引SQL数据库

2025-08-05 10:32:52

苹果公司实习

2025-08-05 07:00:00

双重检查锁Nacos

2025-08-05 09:14:36

内存虚拟机数据

2025-08-05 09:55:34

程序员程序员修补BUG真正原因

2025-08-05 10:41:19

2025-08-05 15:39:33

ensorFlow机器人机器学习
点赞
收藏

51CTO技术栈公众号

尿检ph值偏高说明什么 生化是什么意思 胰管扩张是什么意思 喝什么补气血 神经衰弱吃什么中成药
城隍爷是什么神 请节哀是什么意思 什么是心脏造影 梦见自己的哥哥死了是什么意思 牙槽骨吸收是什么意思
哦耶是什么意思 赛字五行属什么 教师节给老师送什么礼物 戒烟有什么好处 师团长是什么级别
屏保是什么 员级职称是什么意思 脚背痒是什么原因 259是什么意思 生辰八字是指什么
什么是树脂材料hcv8jop4ns7r.cn 痔疮是什么原因引起dayuxmw.com 谦虚的什么hcv9jop1ns1r.cn 小孩测骨龄挂什么科hcv8jop5ns4r.cn 甲状腺不均质改变是什么意思hcv7jop9ns0r.cn
sanag是什么牌子hcv8jop8ns3r.cn 双鱼座的幸运色是什么hcv9jop6ns9r.cn 尿蛋白弱阳性什么意思hcv8jop0ns9r.cn 阿奇霉素是什么药cl108k.com 似乎的近义词是什么hcv8jop4ns7r.cn
三乙醇胺是什么东西hcv9jop4ns8r.cn 什么水果不能吃sanhestory.com 岁月无痕是什么意思hcv8jop6ns0r.cn 田螺吃什么食物hcv9jop1ns8r.cn 吃什么可以化痰hcv9jop7ns0r.cn
痛风什么蔬菜不能吃hcv8jop3ns0r.cn 心跳过快有什么危害hcv8jop9ns4r.cn 查激素水平挂什么科hcv8jop9ns0r.cn 为什么乳头会变黑chuanglingweilai.com 老爹鞋配什么裤子hcv8jop5ns4r.cn
百度