当前位置: 首页 > 原理解释

mybatis3底层原理-Mybatis3 底层原理

我的数据库每次上菜,都带着点“小心机”。 实际上它真没啥玄乎的哲学,就是几百万行代码,干了一件贼好办的事:把数据从硬盘搬进内存,再吐给你。 先说那个最狠的“搬运工”——内存池。 你当作数据库是那种“等我用着,用完再删”的存货店?那是傻X。真正的数据库是“前台接待+后台仓库”的双轨制。用户查表,数据得在内存里调包侠似的蹦跶。出于内存刷新有频率,你每查一次,内存就得腾出个坑,然后从硬盘那几千个物理块里把个数据块给塞进去。
这就叫物理 IO,也就是你常见的“磁盘寻道”要么“显存刷存”。 这就好比你去银行取钱,不是直接去柜台拿,得先把你的钞票转给钱箱,钱箱再转给那个专门收钱的阿姨。阿姨在收钱箱里,有专门的货位,整规整齐码着。你往柜台上摆个东西,阿姨得找位,然后那个货位数据块得去物理硬盘里找那个标号,再去物理硬盘里找那个分页符,最终把数据从物理空间搬到你那张行里。 这时候你要注意了,要是你查的数据是刚查的,那内存里有,不用动硬盘。但要是查的是挺久那会儿、就连你没打开过的那个表,那数据就得从物理硬盘里找,经过层层搬运(物理 IO),最终再搬运回内存(虚拟 IO)。物理 IO 这事儿,数据库级别处理了,你就连感觉不到它。 要不就你写了那种“死锁”要么“长查询”的代码。
这时候,内存里那个“搬运工”忙得团团转,整个数据库的 CPU 都得跟着转。
这时候数据库的“优化器”就得出来搅和搅和了。 优化器是个啥鬼?它是个“老油条”。你查个用户信息,它得想:“这数据在内存里的哪个行?”它去问“哪个表”,“哪个列”,“哪个字段”。它得去问“哪个索引”,“哪个索引”。它得去问“这个索引在哪个物理块上”,“这个物理块在哪个物理页面上”。 这个过程,实际上就是个复杂的路由表。它得在内存里,用刚刚的“搬运工”读出来的结局,去套各种各样的条件,判断这数据该不该回物理硬盘,该不该回内存,该不该走哪条路。 这就有点难了。路径忒多了,数据忒多了。优化器得把几十亿条 SQL 语句,经过几十层过滤,最终只有一条路走。它就像个超级大的 Excel 表格,每一行都是个逻辑,每一列都是个筛选条件。它得找出那条唯一的、最顺畅的路。 要是把数据库比作一座大楼,那内存池就是大楼里的核心办公区,优化器就是大楼里的安保队长。安保队长接到命令:“用户 A 想看用户 B 的联系方式”,安保队长得在大楼里翻档案,查门禁记录,核对账目,最终在大屏上点出那个位置。 这操作量,哪位敢写? 再说说那个最让人头疼的“内存不足”情况。 你查个表,发现内存满了,优化器就慌了,得赶紧让数据跑出去。
这时候,数据库得找块物理空间,把数据搬出来。
这时候,你刚刚的“搬运工”,就得去硬盘里找那个数据块。 这时候,数据库得跟物理磁盘“开对话框”。它跟硬盘说:“嘿,这块地有点小,我们要给你腾地儿。”硬盘得说:“没难题,那行,我腾。” 但这事儿没那么好办。硬盘是胖的,内存是瘦的。你让胖的硬盘,去给瘦的内存让地儿,这得费多大的劲儿?物理寻道,寻道慢;显存刷存,刷存慢。
这个速度,跟你想让东西出来时的心急程度,彻底成反比。 这时候,数据库就得用一些“黑科技”。
比方说,它得把数据切分一下。
原本那一大块数据,切成几块,每块都找物理块。你查某几块,它们就去找。而没查的那些,它们就不用动。
这叫“选择性读”,也就是你常说的“只读那些关键的,不读那些没用的”。 这就像你要找书,你只翻几页,其他的书你就别看了。 最离谱的,还得是“锁”。 数据库查数据,最怕撞车。两个人与此同时想查同一个数据,结局都拿到了。
这就叫死锁。为了防住这个,数据库得有锁。锁,就是把数据锁住,不让别人乱动。 这时候,内存里的数据可能已经被锁住了。优化器得把这数据,从内存里找出来,再塞进物理硬盘里。
这时候,又得让硬盘把数据找出来,再塞进内存。 这活儿,忒脏了。一遍的脏,两遍的脏。 这就涉及到“回表”了。 啥叫回表?回表就是,数据在内存里,优化器把数据从数据库里吐出来。
这时候,内存里的数据,跟物理硬盘里的数据,是两码事。它们不在一个物理块上。 这时候,数据库就得把内存里的数据,再请求硬盘。硬盘得找物理块,再把数据塞回内存。
这时候,又得让内存里的数据,再吐给你。 这过程,一里一外,两头跑。你查个数据,可能得跑两个数据库,再跑两个物理硬盘,最终再跑两个内存。 这就叫“回表”。 回表这事儿,速度挺慢,就连比你想象的要慢。
这速度,跟你想看那个数据的速度,彻底不成正比。 这就害得了一个现象:你查个表,你感觉挺快,但后台服务器可能都在加班。 这时候,优化器得再动。它得去问:“这个表,是不是该换个索引?”是不是该“回表”?
是不是该“预取”?
是不是该“缓存”? 优化器是个百宝箱,它能给你列个表,你照着填,填完,它就知道该如何玩。 比如,它发现这个表被锁住了,那就得去问:“这个数据,能不能换个索引?”它得去问:“这个索引,是不是该‘回表’?”它得去问:“这个索引,是不是该‘预取’?” 这过程,就像你搬家,你搬东西的时候,得先问邻居:“这箱子能不能放我门口?”“这箱子能不能放我屋?”“这箱子能不能放我柜子里?” 这问你的次数多了,你还要不要搬家? 这就是数据库的真相。它不是魔法,它就是一个超级复杂的计算机网络,负责在物理世界和逻辑世界之间,反复搬运数据块,反复请求权限,反复找路。
你看到的“毫秒级响应”,可能只是它做了无数次的“寻道、刷存、锁、回表”之后,才给你吐出来的一个微笑。 它不玩虚的,它只玩数据。你查个数据,它得去物理硬盘里找,找完,再找内存,再吐给你。
这流程,重复了上万次,才能让你感觉不到。 这就是我的数据库,一个由内存、硬盘、优化器、锁、回表机制组成的庞大而精密的机器。你只是它的用户,它服务你,它处理你的请求,它等你。 你想想,你查个数据,它得跑几个数据库?几个物理硬盘?几层内存? 这就叫底层原理。
这就是它的全体秘密。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站