范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

打开黑盒从MySQL架构设计出发,看它是如何执行一条SQL语句的?

  特别说明:本文来自公众号狸猫技术窝的专栏《从零开始带你成为MySQL实战优化高手》,是作者救火队队长开放的试读文章
  1、把MySQL当个黑盒子一样执行SQL语句
  上一讲我们已经说到,我们的系统采用数据库连接池的方式去并发访问数据库,然后数据库自己其实也会维护一个连接池,其中管理了各种系统跟这台数据库服务器建立的所有连接
  我们先看下图回顾一下
  当我们的系统只要能从数据库连接池获取到一个数据库连接之后,我们就可以执行增删改查的SQL语句了
  从上图其实我们就可以看到,我们可以通过数据库连接把要执行的SQL语句发送给MySQL数据库。
  然后呢?大部分同学了解到这个程度就停下来了,然后大家觉得要关注的可能主要就是数据库里的表结构,建了哪些索引,然后就按照SQL语法去编写增删改查SQL语句,把MySQL当个黑盒子去执行SQL语句就可以了。
  我们只知道执行了insert语句之后,在表里会多出来一条数据;执行了update语句之后,会对表里的数据进行更改;执行了delete语句之后,会把表里的一条数据删除掉;执行了select语句之后,会从表里查询一些数据出来。
  如果语句性能有点差?没关系,在表里建几个索引就可以了!可能这就是目前行业内很多工程师对数据库的一个认知,完全当他是个黑盒子,来建表以及执行SQL语句。
  但是大家既然跟着我开始学习了,从现在开始就要打破这种把数据库当黑盒子的认知程度,要深入底层,去探索数据库的工作原理以及生产问题的优化手段!
  2、一个不变的原则:网络连接必须让线程来处理
  现在假设我们的数据库服务器的连接池中的某个连接接收到了网络请求,假设就是一条SQL语句,那么大家先思考一个问题,谁负责从这个连接中去监听网络请求?谁负责从网络连接里把请求数据读取出来?
  我想很多人恐怕都没思考过这个问题,但是如果大家对计算机基础知识有一个简单了解的话,应该或多或少知道一点,那就是网络连接必须得分配给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句,如下图所示:
  3、SQL接口:负责处理接收到的SQL语句
  接着我们来思考一下,当MySQL内部的工作线程从一个网络连接中读取出来一个SQL语句之后,此时会如何来执行这个SQL语句呢?
  其实SQL是一项伟大的发明,他发明了简单易用的数据读写的语法和模型,哪怕是个产品经理,或者是运营专员,甚至是销售专员,即使他不会技术,他也能轻松学会使用SQL语句。
  但如果你要去执行这个SQL语句,去完成底层数据的增删改查,那这就是一项极度复杂的任务了!
  所以MySQL内部首先提供了一个组件,就是SQL接口(SQL Interface),他是一套执行SQL语句的接口,专门用于执行我们发送给MySQL的那些增删改查的SQL语句
  因此MySQL的工作线程接收到SQL语句之后,就会转交给SQL接口去执行,如下图。
  4、查询解析器:让MySQL能看懂SQL语句
  接着下一个问题来了,SQL接口怎么执行SQL语句呢?你直接把SQL语句交给MySQL,他能看懂和理解这些SQL语句吗?
  比如我们来举一个例子,现在我们有这么一个SQL语句:
  select id,name,age from users where id=1
  这个SQL语句,我们用人脑是直接就可以处理一下,只要懂SQL语法的人,立马大家就知道他是什么意思,但是MySQL自己本身也是一个系统,是一个数据库管理系统,他没法直接理解这些SQL语句!
  所以此时有一个关键的组件要出场了,那就是查询解析器
  这个查询解析器(Parser)就是负责对SQL语句进行解析的,比如对上面那个SQL语句进行一下拆解,拆解成以下几个部分:
  我们现在要从"users"表里查询数据
  查询"id"字段的值等于1的那行数据
  对查出来的那行数据要提取里面的"id,name,age"三个字段。
  所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情,如下图所示:
  5、查询优化器:选择最优的查询路径
  当我们通过解析器理解了SQL语句要干什么之后,接着会找查询优化器(Optimizer)来选择一个最优的查询路径。
  可能有同学这里就不太理解什么是最优的查询路径了,这个看起来确实很抽象,当然,这个查询优化器的工作原理,后续将会是我们分析的重点,大家现在不用去纠结他的原理。
  但是我们可以用一个极为通俗简单的例子,让大家理解一下所谓的最优查询路径是什么。
  就用我们刚才讲的那个例子好了,我们现在理解了一个SQL想要干这么一个事儿:我们现在要从"users"表里查询数据,查询"id"字段的值等于1的那行数据,对查出来的那行数据要提取里面的"id,name,age"三个字段。
  事是明白了,但是到底应该怎么来实现呢?
  你看,要完成这个事儿我们有以下几个查询路径(纯属用于大家理解的例子,不代表真实的MySQL原理,但是通过这个例子,大家肯定能理解所谓最优查询路径的意思):
  直接定位到"users"表中的"id"字段等于1的一行数据,然后查出来那行数据的"id,name,age"三个字段的值就可以了
  先把"users"表中的每一行数据的"id,name,age"三个字段的值都查出来,然后从这批数据里过滤出来"id"字段等于1的那行数据的"id,name,age"三个字段
  上面这就是一个最简单的SQL语句的两种实现路径,其实我们会发现,要完成这个SQL语句的目标,两个路径都可以做到,但是哪一种更好呢?显然感觉上是第一种查询路径更好一些。
  所以查询优化器大概就是干这个的,他会针对你编写的几十行、几百行甚至上千行的复杂SQL语句生成查询路径树,然后从里面选择一条最优的查询路径出来。
  相当于他会告诉你,你应该按照一个什么样的步骤和顺序,去执行哪些操作,然后一步一步的把SQL语句就给完成了。
  我们来一起看看下面的图:
  6、调用存储引擎接口,真正执行SQL语句
  最后一步,就是把查询优化器选择的最优查询路径,也就是你到底应该按照一个什么样的顺序和步骤去执行这个SQL语句的计划,把这个计划交给底层的存储引擎去真正的执行。
  这个存储引擎是MySQL的架构设计中很有特色的一个环节。
  不知道大家是否思考过,真正在执行SQL语句的时候,要不然是更新数据,要不然是查询数据,那么数据你觉得存放在哪里?
  说白了,数据库也不是什么神秘莫测的东西,你可以把他理解为本身就是一个类似你平时写的图书馆管理系统、电信计费系统、电商订单系统之类的系统罢了。
  数据库自己就是一个编程语言写出来的系统而已,然后启动之后也是一个进程,执行他里面的各种代码,也就是我们上面所说的那些东西。所以对数据库而言,我们的数据要不然是放在内存里,要不然是放在磁盘文件里,没什么特殊的地方!
  所以我们来思考一下,假设我们的数据有的存放在内存里,有的存放在磁盘文件里,如下图所示。
  那么现在问题来了,我们已经知道一个SQL语句要如何执行了,但是我们现在怎么知道哪些数据在内存里?哪些数据在磁盘里?我们执行的时候是更新内存的数据?还是更新磁盘的数据?我们如果更新磁盘的数据,是先查询哪个磁盘文件,再更新哪个磁盘文件?
  是不是感觉一头雾水
  所以这个时候就需要存储引擎了,存储引擎其实就是执行SQL语句的,他会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据,等等,执行诸如此类的一系列的操作,如下图所示。
  MySQL的架构设计中,SQL接口、SQL解析器、查询优化器其实都是通用的,他就是一套组件而已。
  但是存储引擎的话,他是支持各种各样的存储引擎的,比如我们常见的InnoDB、MyISAM、Memory等等,我们是可以选择使用哪种存储引擎来负责具体的SQL语句执行的。
  当然现在MySQL一般都是使用InnoDB存储引擎的,至于存储引擎的原理,后续我们也会深入一步一步分析,大家不必着急。
  7、执行器:根据执行计划调用存储引擎的接口
  那么看完存储引擎之后,我们回过头来思考一个问题,存储引擎可以帮助我们去访问内存以及磁盘上的数据,那么是谁来调用存储引擎的接口呢?
  其实我们现在还漏了一个执行器的概念,这个执行器会根据优化器选择的执行方案,去调用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了。
  举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取"users"表中的第一行数据,然后判断一下这个数据的"id"字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取"users"表的下一行数据。
  就是基于上述的思路,执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划,大致就是不停的更新或者提取一些数据出来
  我们看下图的示意
  8、思考题:打开脑洞,你觉得不同的存储引擎是用来干什么的?
  今天给大家留一个小的思考题,就是你先别管MySQL有哪些存储引擎,你就从业务场景来出发考虑,有的场景可能是高并发的更新,有的场景可能是大规模数据查询,有的场景可能是允许丢失数据的
  那么你觉得如果让你来设计存储引擎,你觉得应该有哪些存储引擎,分别适用于什么场景?
  希望大家在评论区留言,踊跃思考和回复。
  END
  作者:救火队队长,阿里资深技术专家
  来源:公众号狸猫技术窝专栏《从零开始带你成为MySQL实战优化高手》
  如有收获,请划至底部,点击"在看",谢谢!
  QQ群二维码如下, 添加请注明:地区+职位,否则不予通过

有些路,只能一个人走微信通讯录超过200人的,想访问一下你,到底有多少人是经常见面和联系的。你说,这问题挺心酸的。不,对于销售行业的人来说,这是必须的。微信还没火之前,大家都是QQ联系的,那时候不管是蝴蝶效应带来的人生选择蝴蝶效应说一只蝴蝶在亚马逊流域煽动翅膀,就会在密西西比河流域掀起一场风暴。一个微小的动作,能牵动一场风暴。一个微小的决定,能改变你一生。01面对选择,是人生必经阶段小时候我们只能被人生需要改变,而不是一成不变最近同事阿雅帮孩子换了学校,听她聊到班级群已经建立起来了。想起当时的迷惘,顿时烟消云散。事情一件一件地落实,可以踏实地准备开学工作。生怕孩子适应不了学习跟不上朋友离她而去老师是否尽管住你的嘴,把情商低的人比下去我第一次意识到自己话多到了不妥的程度,是我老板把我叫到办公室。他笑眯眯地问小李,你是独生子女吧?你原来叫李贝贝,小学四年级才改的名,你妈妈有四个兄弟姐妹,你外婆是个老革命。我当时的最好的活法寡言,寡欲,寡思文带刺凤梨古有云心清万里明,可杜倖时窥。寡欲善养心,轩鉴照魅魑。即清心寡欲,清静无为自然内心平静,波澜不惊,岁月静好。除了寡欲,还能做到寡言寡思才是人生至境。有句话说得好,人生就是39岁张韶涵晒健身照,无美颜滤镜下身材太过真实,真没P过吗张韶涵,提起这位女明星的名字想必大家都是非常熟悉了吧,她出道多年为大家带来了非常多优秀的音乐作品,像欧若拉隐形的翅膀等等都传唱至今,喜欢这位女歌手的歌迷很多,近年来张韶涵也一直都有一场面试引起的思考01hr一场预计45分钟的面试,10分钟就结束了。上周同事接到了猎头电话,告知会推荐其到一家外资银行某职位。虽然同事对银行业并没什么经验,但猎头选她肯定有一定的原因。于是开始准备资人生是用来改变的,你的努力终会让人看见你可能只知道薇娅是一个网红,一个直播王后,但你不知道的是,她在成为这样的成功人士之前所经历的一切。今天,我拿起薇娅人生是用来改变的这本书,读了一遍。薇娅,一个16岁就独自到北京闯荡相处不累的正确打开方式请好好说话最近在跟女儿练习压腿,她一直都在上跳舞课,我就去请教她。她知道我平时喜欢读书,给了我一个建议让我在练习压腿的时候,每翻十页书就休息一页。开始我觉得这个建议还是挺好的,突然就觉得女儿40岁阿娇录节目,胖到好像开了特效,阿Sa采访透露她变胖原因女明星出现在公众场合的时候几乎都是光鲜亮丽的,精致的妆容与时尚的着装都是标配,就连社交平台晒出的照片大多也是被工作人员精修过的,因此有很多网友就觉得明星们这么完美的模样都是包装出来你若善待一切,就会被一切善待不知道你有否发现,有这么一种社会现象,假如在马路边有老人跌倒了,大家都不敢走过去帮忙,生怕是碰瓷党。你会思前想后,停下来看一看有没有好心人过去帮忙然后再做决定。但是世界上从来不缺善
世间只有三件事,做好一件你都是人生赢家生活中总是上演这样的场景路上的我们,行色匆匆。不敢有片刻的延误,因为上班是不能迟到的。来到公司,还没来得及喘口气,今天的日程就已经安排好了。于是整个人就像陀螺一样的转个不停。晚上下这世间的事除了生死,又有哪一桩不是闲事呢?人的这一生,你有很多种选择,对于生活中,开心也是过,伤心也是过,轻松也是过。与其愁眉苦脸着,不如露出笑脸来,把心放宽一点,把事看淡一点!享受一天是一天,舒服一秒是一秒。喜怒哀乐全体撞了南墙,就应该回头审视自我人生险恶,诱惑太多,要想及时回头,并不容易。人生,简单两个字,很多人却一辈子都参不透。也许,真要等到生命终结的那一时,才能揭晓真正的答案。有些人活了大半辈子,却并不快乐,心中的责任在缺憾中彰显不屈的自我人生,不可能是完美无缺的。新颜换旧貌,繁花终落尽,这样的遗憾历历在目,这样的伤感在所难免。面对一时的失足,有人会悔恨面对不幸的分离,有人会心痛。然而,缺憾并非一无是处,它也可以转化突然发现自己老了(心酸)每天不知道为什么而忙碌着,当看到镜子里饱经风霜的自己,才猛然发觉,生活依然是老样子。可我们却变了,青春的容颜,不知不觉已经刻上了岁月的痕迹。不得不承认,在一天天的忙碌中,日子也在一生活,需要用心去感受,用心去发现生活中,总会有一些事值得回忆,也总有一些事需要放弃。人之所以会烦恼,就因为走得太快想得太多。不该记住的,全都留在了记忆里应该记住的,反倒被挤压在了角落里。走得太快,想得太多,心就会有所为是目的,有所不为是达到目的的手段和方法人不可无刚,无刚则不能自立,这里的刚就是指原则。鲁迅曾说人世间真是难处的地方,说一个人不通世故固然不是好话,但是说他深于世故也不是好话。很多人在生活中常常把握不住自己,在心中不知不人生最稳定的捷径,就是坚持读一流好书毛主席一生特别爱读书。他青年时期曾在繁华的马路旁昏暗的路灯下看书,甚至躲在厕所里看书。新中国成立后,他总是挤出时间来读书,他的住所里,床上办公桌上休息间里,甚至卫生间里都放着书,一疯狂过后,一地鸡毛昨天,币圈的以太币ETH疯涨,创历史新高,涨到你怀疑人生。只是,有的人就纳闷了,为什么涨了那么多还在涨,就没人管管嘛?其实,在币圈市场,这样的事情早已是司空见惯了。可以这么说,供需仰望人民币玩家在头条阅读文章,阅读新闻,可以经常看到很多人民币玩家,也叫做土豪或者富婆。所谓的人民币玩家大概有几种第一种游戏玩家,这些人只要自己打得不开心,就会直接在里面猛充点人民币,升级秒杀自日更365天,我付出了什么官宣,官宣,重要情报官宣!我终于坚持了日更365天!意不意外,惊不惊喜,刺不刺激?每天坚持在各平台写文章发表作品,竟然也坚持了一年了!一年说长也不长,说短也不短。那么,言归正传,回