面试官你说说一条查询SQL的执行过程
为了理解这个问题,先从Mysql的架构说起,对于Mysql来说,大致可以分为3层架构。
第一层作为客户端和服务端的连接,连接器负责处理和客户端的连接,还有一些权限认证之类。比如客户端通用用户名密码连接到Mysql服务器,还有对于数据库表的执行权限。
第二层是核心层,基本上Mysql大部分的核心功能都在这一层,包括查询缓存、解析器、优化器之类,比如SQL解析、优化、索引选择,到最后生成执行计划。
第三层则是存储引擎了,Mysql通过执行引擎直接调用存储引擎API查询数据库中数据。
通过Mysql的架构分层,我们首先就可以很清晰的了解到一个SQL的大概的执行过程。 首先客户端发送请求到服务端,建立连接。 服务端先看下查询缓存是否命中,命中就直接返回,否则继续往下执行。 接着来到解析器,进行语法分析,一些系统关键字校验,校验语法是否合规。 然后优化器进行SQL优化,比如怎么选择索引之类,然后生成执行计划。 最后执行引擎调用存储引擎API查询数据,返回结果。
这就是一个很概括性的SQL执行过程,接下来,具体到每个步骤详细说明一下。 查询缓存
如果你翻看Mysql的官方文档就会知道,查询缓存在5.7.20版本已经被弃用,并且8.0的版本已经删除了。为啥要删除,可能觉得太鸡肋了吧。
我们可以通过命令来查看查询缓存是否可用。 mysql> SHOW VARIABLES LIKE "have_query_cache"; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | have_query_cache | YES | +------------------+-------+
除此之外,查询缓存还有一些核心参数。更具体的说明可以参考官方文档。
query_cache_type :是否打开查询缓存,值为012,分别对应为OFFONDEMAND,ON的话则代表开启查询缓存,但是可以通过SELECT SQL_NO_CACHE 来手动禁用,DEMAND则代表只缓存以SELECT SQL_CACHE 开头的SQL语句。
query_cache_limit :缓存结果大小限制,如果查询结果超过大小则不会被缓存,默认是1M大小。
query_cache_size :为查询缓存分配的内存大小,他是1024的整数倍。
query_cache_min_res_unit :查询缓存分配内存块的最小单位,默认为4KB。这是查询缓存分配内存的基本单位,即便比如查询的数据只有1个字节,也会按照最小内存单元大小来分配内存空间。
在进行SQL解析之前,系统会判断查询缓存是否打开,如果打开,就拿缓存中的查询和传入的查询比较,如果完全一样,就会从缓存中直接返回。
但是需要特别注意的是,无论大小写、空格还是注释,都会影响缓存的命中结果,也就是说必须完全一样!
比如以下的SQL大小写不同、多了空格都无法命中查询缓存。 select * from user; SELECT * from user; select * from user; 解析器&预处理器
如果查询缓存未命中,就会进入正常的SQL执行环节。
首先就像我们正常的业务开发一样,第一步都是对参数的规则校验,Mysql也一样,解析器会进行词法语法分析,基于语法规则对SQL进行校验。
比如关键字是否使用正确啊,或者说关键字顺序是不是正确,比如说你把 select 写成了selct ,order by 写成了by order 。
如果校验OK,那么就生成一颗"解析树"。
接着预处理器就是进一步依据合法规则生成的解析树进行校验,比如表名、列名是否存在等等。 优化器
如果说解析器和预处理器是我们业务逻辑的前置校验环节,优化器就是真正的处理业务逻辑的地方。
一条查询SQL可以有N种执行方式,优化器的最终目标是找到最好的执行计划,交给执行引擎去执行。
但是实际使用中我们经常会发现,Mysql经常有选择错索引的情况,我明明有更快的索引,结果它不用,导致搞出了慢查询。
这是因为Mysql的优化器是基于成本模型的优化器,他只是基于已有的成本计算公式来选择一个成本最低的执行方式,这个执行方式不一定会是最快的,只能说大多数时候,优化器的选择比我们自己的选择更准确。
总的来说,这个优化过程太复杂了,流程大致就是下图所示,更详细的内容可以看《数据库查询优化器的艺术原理解析与SQL性能》这本书(我实在是懒得看了,吐了)。
执行引擎
大部分核心的事情已经被优化器处理完了,最后执行引擎只要根据生成好的执行计划查询数据返回就好了,这一步相对就挺简单了。
执行引擎只需要根据执行计划的指令调用存储引擎的API就可以了。
当然这一步如果可以缓存查询结果,那么就在这个阶段把查询结果缓存下来,然后把结果返回给客户端就可以了。 总结
一图胜千言。
原文地址:https://mp.weixin.qq.com/s/g6IZ_vtiAIZXLTyudfLNnw
超级玛丽其实就是人生儿时大家一起玩红白机必玩的游戏超级玛丽。从一出来面对第一个蘑菇怪你会发现它长得凶神恶煞要从头顶踩扁。没办法蘑菇怪长得矮小自卑怕被人嘲笑为了不被人嘲笑装着很凶的表情其实很脆弱踩它一角
马妹甄姬徐庶,摸鱼开荒开5也不慢作者无冬西界摘要摸鱼也能开5,了解一下?队伍配置这是笔者帮人配将测试的开荒队伍,该配置在公认难度最高的太师乱汉剧本中开荒飞起,摸鱼开荒仍然在次日早上7点成功开5。由于我忘了告诉号主
德杯预测激战进行时,上演神级预测?调侃IG是至臻IDI队更多比赛点击德杯进行时上演神级预测,调侃IG是至臻IDI队!就在最近,全新的英雄联盟德玛西亚杯赛事正式拉开帷幕,而在此期间,它也吸引了全网游戏玩家的殷切关注。熟悉这个赛事的网友应该
王者荣耀小白扫盲,别再瞎打架了,真心让想赢的队友心累王者荣耀虽然运行已有5。6年,但依然有很多的新玩家,对于游戏内容和玩法还不是很了解,今天小编就来给大家分享一下这款游戏的一些基础知识。1。红buff和蓝buff。游戏内的两种加状态
王者荣耀传奇英雄故事多,玩家我最爱夏侯惇王者荣耀中的夏侯惇不仅在传统文化故事背景中拥有传奇的一生,在王者中同样也展示了其骁勇善战的一面,是一位深受玩家喜爱的真英雄。在三国演义中夏侯惇少年时以勇气闻名于乡里。曹操起兵,夏侯
怎样的武侠游戏才是玩家需要的?可能需要做减法说起武侠游戏,你首先想到的是什么?很多小伙伴给我的答案都是氪金打怪,升级,这些无聊的字眼。这样一种堪称枯燥的游戏方式,让很多玩家都感到无聊,慢慢地也就弃坑了。所以很多游戏也就随着时
11。24三大高胜率英雄推荐!岩雀小丑领衔制胜11。24版本野区的高胜率英雄往往能够帮助同学们高效上分,下面我们就来看看韩服胜率很高的三大英雄吧岩雀塔利娅符文搭配主宰巫术岩雀的一套技能消耗对手不少血量能够完美触发黑暗收割,恶意
克制兰陵王的英雄你知道几位最克制兰陵王的五位英雄,众所周知,兰陵王是峡谷里所有无位移脆皮的噩梦,因为他凭借被动隐身,加上高额爆发伤害能够在不经意间瞬秒脆皮,甚至频繁针对让C位经济和等级都降到全场最低。不管兰
任天堂警告圣诞节Switch服务器可能不稳定玩家要提前做好准备去年圣诞节,任天堂eShop曾发生过载宕机的事故,而今年圣诞节考虑到许多玩家将购买新Switch游戏和礼品卡,任天堂提前发出了服务器可能不稳定的警告。在任天堂日本客户服务账号上,该
英雄联盟手游排位上分,这四个英雄就够了Hello大家好,本期为您推荐四个版本强势英雄,助您排位轻松上分,话不多说,直接上干货。小鱼人小鱼人作为人气非常高的法系刺客,集突进无敌和击飞等优点于一身,无论是对线能力还是边路游
UZI成功带火三修流卡莎!8700金币快速成型,QW伤害颠覆理解前言英雄联盟季前赛版本推出了不少新装备,但自从版本更新后,AD的胜率持续走低,玩家纷纷抱怨AD越来越难玩了。其实英雄联盟官方策划曾透露过新版本是打算扶持AD的,可惜策划的良苦用心却