小美,这篇查询SQL执行流程你一定要看

前言

宿舍里,小A兴致满满的将刚写好的查询SQL执行流程文章通过微信发给小美,回想起昨晚透过窗户意外看到小美哭的梨花带雨,问过她室友才知道竟然是因为面试被SQL执行流程给难住了。心里暗自下决心:作为小美背后的男人,我绝不允许!

另一边小美收到备注为备胎N号-小A发的消息下意识就要关掉,却模糊间看到了查询SQL执行流程几个关键字。想起被面试官吊打的情景,按耐不住打开了文章。发现根本停不下来,忍不住两眼直冒金光。

image

正文开始

MySQL 是我们工作中必不可少的技术栈,怎么都避不开它。在使用 MySQL 时,我们最经常接触的就是DML语句,但是一条DML语句是如何执行的你了解嘛?接下来我们就以查询语句为例,详细解析它在 MySQL 中的执行流程。

image

上图是一条查询SQL的主要流程,简单概述下:

  1. 同 MySQL 建立连接,并进行权限认证和校验
  2. 根据 SQL 语句查询缓存,命中则直接返回
  3. 未命中则对 SQL 进行词法、语法解析,异常则抛出错误
  4. 生成执行计划,进行索引选择(不一定是最优解)
  5. 执行器操作存储引擎执行 SQL 语句,返回结果

可以看出主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心功能。而存储引擎负责数据的存储和提取,支持 InnoDB、MyISAM、Memory 等多个存储引擎。

连接器

第一步就需要与连接器打交道,一般通过以下命令建立链接:

<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">mysql -h ip -P port -u user -p password </pre>

账号和密码校验通过后,会到权限表中查出用户所拥有的权限。后续的权限校验都会据此来作出判断,相当于一个权限快照,后续的权限修改不影响已成功建立连接的用户。

可以通过 SHOW PROCESSLIST; 命令查看当前连接,如果连接长时间处于 Sleep,到达 wait_timeout(默认8小时),连接器会自动将连接主动断开

image

断开连接后请求就会收到一个错误提醒,需要重新建立连接。而如果客户端持续有请求 MySQL 则会重复使用同一个连接(长连接)。不能每次执行完几条 SQL 语句就断开连接,下次查询再重新建立(短连接)。建立连接的过程比较复杂,持续使用短连接会影响系统性能。在实际开发过程中,我们都会使用连接池来维护连接,完成 SQL 语句执行。

使用长连接可能会遇到MySQL内存飞涨(临时使用的内存是管理在连接对象中,会在连接断开时才释放);如果长连接过多,会导致内存占用过大,被系统强制 Kill 掉(Out Of Memory),导致 MySQL 发生异常重启。通常有两种解决方式:

  • 定期断开长连接,在系统执行完一个较大内存查询后
  • 如果当前 MySQL 版本大于等于5.7,可以通过通过mysql_reset_connection重新初始化连接资源。不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存

建立连接后,Mysql 接收到客户端的查询语句,会先查询缓存。如果该查询语句之前执行过(需要语句完全一致),则其结果可能被缓存下来,后续命中缓存的情况下可以直接返回给客户端。

看上去查询效率很高,但在实际使用中通常会关闭该功能(8.0版本后删除了该功能)。因为缓存失效概率非常大,只需要对表数据做更新就会导致该表的所有缓存都失效。可通过命令将 query_cache_type 设置成 DEMAND,关闭该功能。

分析器

进入到分析器后,接下来才是真正进入执行 SQL 流程。

首先会进行词法分析,一条 SQL 语句通常由很多个字符串、空格拼接而成,会把字符串中的关键字、表名、字段名等拆解出来

进行语法分析时,将一条 SQL 语句生成一个数据结构,这个数据结构我们把它叫做解析树(select_lex)。接着判断其语法规则是否符合,如果服务器进程认为SQL语句不符合语法规则的时候,就会把这个错误信息反馈给客户端。

最后进行语义解析,判断对应的表名、字段名、视图等等是否在数据库中存在,不存在就直接报错给用户。

优化器

优化器主要是对当前执行语句进行优化,得到当前形势下最有效的执行路径,生成该语句的执行计划。

往往实际运用中,一个表会存在多个索引。每个 SQL 语句可能满足多个索引的使用规则,优化器是在表里面有多个索引的时候,决定使用哪个索引或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

现在默认使用的是CBO(成本优化器),从目标诸多的执行路径中选择一个成本相对最小的执行路径来作为执行计划。这里的成本是基于查询语句使用不同索引时对当前系统的IO、CPU等消耗来进行估算,从而选择一个成本最低的执行计划

执行计划

到达最后执行时,会先做用户的权限校验,判断是否有当前表、列等数据的查询权限。

权限没问题就会调用存储引擎提供的接口查询数据。例如用InnoDB引擎接口去扫描这个表的第一行,判断职业为程序员,如果不是则跳过,如果是则将这行存在结果集中 调用引擎接口取下一行,重复相同的逻辑判断,直到取到这个表的最后一行。

最后执行器将满足条件的所有数据汇总成一个结果集返回给客户端

总结

小美看完内心忍不住感慨,小A平时看着呆头呆脑的,还是有点东西啊!以后要多跟他交流,面试官还不得对我刮目相看。(默默将备胎N号-小A升级为备胎一号-小A

image

希望对你也有帮助,SQL 执行流程是面试经常被问的问题,看完这篇文章妈妈再也不用担心面试官问你这题了。如果大家对 MySQL 其他问题感兴趣或者面试被问到回答不好的(也不局限于 MySQL,可以是 Java 各方面),可以留言或私信,根据反馈持续更新。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容