<div class="WordSection1" style="layout-grid:15.6pt;">
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal" align="center" style="text-align:center;">
<b><span lang="EN-US" style="font-size:16.0pt;">MySQL innodb</span></b><b><span style="font-size:16.0pt;font-family:宋体;">体系结构</span></b>
</p>
<!--more-->
<p class="MsoNormal" style="margin-left:21.0pt;text-indent:21.0pt;">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal" style="margin-left:21.0pt;text-indent:21.0pt;">
<span lang="EN-US">2015</span><span style="font-family:宋体;">年</span><span lang="EN-US">9</span><span style="font-family:宋体;">月</span><span lang="EN-US">20</span><span style="font-family:宋体;">日星期日</span><span lang="EN-US"> 20:00</span><span style="font-family:宋体;">—</span><span lang="EN-US">20:40</span><span style="font-family:宋体;">,我观看了博森瑞的关于</span><span lang="EN-US">mysql</span><span style="font-family:宋体;">体系结构网络公开课,这次课程简单介绍了</span><span lang="EN-US">innodb</span><span style="font-family:宋体;">存储引擎的一些内部结构,只是抛砖引玉,给大家开了头,更多的内容还需要再学习,这些显然是不够的。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span><span style="font-family:宋体;">期待博森瑞的下次网络公开课。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US"><img width="440" height="239" id="图片 1" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_14428433084OLa.png" /></span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US"><img width="553" height="369" id="图片 2" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_1442843312s2B8.jpg" /></span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span style="font-family:宋体;">上图中的</span><span lang="EN-US">parse</span><span style="font-family:宋体;">是查询分析器组件。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US">Enterprise management services</span><span style="font-family:宋体;">是管理服务和工具组件</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span lang="EN-US">mysql</span><span style="font-family:宋体;">的体系结构包括</span><span lang="EN-US" style="background:yellow;">server</span><span style="font-family:宋体;background:yellow;">层和存储层</span><span style="font-family:宋体;">。其中</span><span lang="EN-US" style="background:yellow;">server </span><span style="font-family:宋体;background:yellow;">层包含连接层和</span><span lang="EN-US" style="background:yellow;">sql</span><span style="font-family:宋体;background:yellow;">层</span><span style="font-family:宋体;">。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span><span style="font-family:宋体;">下面来看客户发出一条</span><span lang="EN-US">select</span><span style="font-family:宋体;">语句经过的路径。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span lang="EN-US">1</span><span style="font-family:宋体;">、一条</span><span lang="EN-US">sql</span><span style="font-family:宋体;">先进内存池</span><span lang="EN-US">query cache</span><span style="font-family:宋体;">(在</span><span lang="EN-US">oracle</span><span style="font-family:宋体;">先进</span><span lang="EN-US">library cache</span><span style="font-family:宋体;">,</span><span lang="EN-US">library cache</span><span style="font-family:宋体;">里面会缓存这条</span><span lang="EN-US">sql</span><span style="font-family:宋体;">语句的执行计划)。在</span><span lang="EN-US">mysql query cache</span><span style="font-family:宋体;">中,先判断这个</span><span lang="EN-US">sql</span><span style="font-family:宋体;">语句在</span><span lang="EN-US">query cache</span><span style="font-family:宋体;">里面有没有缓存。如果有缓存,那么还要判断这条</span><span lang="EN-US">sql</span><span style="font-family:宋体;">有没有权限访问数据库(</span><span lang="EN-US">mysql.user</span><span style="font-family:宋体;">表判断,即用户名密码是否对等),如果有权限,直接把内存中的结果返回给用户。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span lang="EN-US">2</span><span style="font-family:宋体;">、如果</span><span lang="EN-US">query cache</span><span style="font-family:宋体;">没有这个</span><span lang="EN-US">sql</span><span style="font-family:宋体;">。那么这个</span><span lang="EN-US">sql</span><span style="font-family:宋体;">就进入解析器</span><span lang="EN-US">(</span><span style="font-family:宋体;">因为计算机只认识二进制语言,而不认识</span><span lang="EN-US">select</span><span style="font-family:宋体;">这种文本语言,所以需要</span><span lang="EN-US">mysql</span><span style="font-family:宋体;">的解析器把</span><span lang="EN-US">sql</span><span style="font-family:宋体;">文本语句解析成计算机认识的二进制语言,即解析数</span><span lang="EN-US">)</span><span style="font-family:宋体;">。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> 3</span><span style="font-family:宋体;">、然后这条</span><span lang="EN-US">sql</span><span style="font-family:宋体;">进入预处理环节,用来处理解析器没有把</span><span lang="EN-US">sql</span><span style="font-family:宋体;">解析好的,预处理再把这样的</span><span lang="EN-US">sql</span><span style="font-family:宋体;">重新处理一下。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> 4</span><span style="font-family:宋体;">、然后</span><span lang="EN-US">sql</span><span style="font-family:宋体;">进入查询优化器,在此环节对</span><span lang="EN-US">sql</span><span style="font-family:宋体;">语句中的</span><span lang="EN-US">join</span><span style="font-family:宋体;">,排序进行优化。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> 5</span><span style="font-family:宋体;">、然后通过程序的</span><span lang="EN-US">api</span><span style="font-family:宋体;">接口调用这条</span><span lang="EN-US">sql</span><span style="font-family:宋体;">。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> 6</span><span style="font-family:宋体;">、最后</span><span lang="EN-US">sql</span><span style="font-family:宋体;">进入存储层,通过存储引擎到最底层去提取数据,然后把数据返回给用户。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US"><img width="554" height="377" id="图片 3" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_1442843314xSXI.jpg" /></span>
</p>
<p class="MsoNormal">
<span lang="EN-US"><img width="554" height="367" id="图片 4" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_1442843317bBaB.jpg" /></span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US">innodb</span><span style="font-family:宋体;">包含</span><span lang="EN-US">innodb buffer pool</span><span style="font-family:宋体;">,</span><span lang="EN-US">buffer pool</span><span style="font-family:宋体;">是决定数据库性能的。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US">purge thread</span><span style="font-family:宋体;">是用来管理</span><span lang="EN-US">undo</span><span style="font-family:宋体;">数据的保留时间的(</span><span lang="EN-US">oracle</span><span style="font-family:宋体;">是默认保存</span><span lang="EN-US">undo 15</span><span style="font-family:宋体;">分钟)。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US">master thead </span><span style="font-family:宋体;">用来管理子线程,提醒子进程什么时候去工作。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US">oracle</span><span style="font-family:宋体;">花费</span><span lang="EN-US">74</span><span style="font-family:宋体;">亿美元收购</span><span lang="EN-US">Mysql</span><span style="font-family:宋体;">,足以说明</span><span lang="EN-US">mysql</span><span style="font-family:宋体;">的价值。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"><img width="554" height="385" id="图片 5" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_1442843321jBGx.jpg" /></span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span lang="EN-US">innodb log
buffer</span><span style="font-family:宋体;">就是</span><span lang="EN-US">redo log
buffer</span><span style="font-family:宋体;">。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;">一条</span><span lang="EN-US">sql</span><span style="font-family:宋体;">先到内存中找数据,如果内存中没有数据,就需要到磁盘上去找数据。在磁盘上找到数据后,再把数据缓存到内存中,以便下次直接从内存中读取数据。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;background:yellow;">数据真正存储在页中,当</span><span lang="EN-US" style="background:yellow;">sql</span><span style="font-family:宋体;background:yellow;">找到数据后,再把页中数据放到内存中,页中的数据进入内存中后,就叫</span><span style="background:yellow;"> <span lang="EN-US">buffer</span></span><span style="font-family:宋体;background:yellow;">了。简单的说,数据在磁盘中叫</span><span lang="EN-US" style="background:yellow;">page</span><span style="font-family:宋体;background:yellow;">页,把页中数据放到内存中,就叫</span><span lang="EN-US" style="background:yellow;">buffer</span><span style="font-family:宋体;background:yellow;">了。内存是由一个一个</span><span lang="EN-US" style="background:yellow;">buffer</span><span style="font-family:宋体;background:yellow;">组成的。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;">内存中的</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">是由链(即</span><span lang="EN-US">chain</span><span style="font-family:宋体;">)来管理</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;">内存命中率:我们希望内存缓冲更多的热数据。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span lang="EN-US">innodb</span><span style="font-family:宋体;">通过逻辑存储单元(即段、区、页)来存储数据。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;">一个表就是一个段。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;background:yellow;">一个大段可以由</span><span lang="EN-US" style="background:yellow;">4</span><span style="font-family:宋体;background:yellow;">个区组成,一个区又是由</span><span lang="EN-US" style="background:yellow;">64</span><span style="font-family:宋体;background:yellow;">个连续的页组成,一个页是</span><span lang="EN-US" style="background:yellow;">16k</span><span style="font-family:宋体;background:yellow;">。</span>
</p>
<p class="MsoNormal">
<span style="font-family:宋体;background:yellow;">一张表就是一个段。所以一个区大概是</span><span lang="EN-US" style="background:yellow;">1M</span><span style="font-family:宋体;background:yellow;">(</span><span lang="EN-US" style="background:yellow;">64*16k=1M</span><span style="font-family:宋体;background:yellow;">),一个段大概是</span><span lang="EN-US" style="background:yellow;">4M</span><span style="font-family:宋体;background:yellow;">。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;">页是</span><span lang="EN-US">Mysql innodb</span><span style="font-family:宋体;">存储引擎</span><span lang="EN-US"> i/o</span><span style="font-family:宋体;">的最小单位。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;">页里包含页头,页中,页尾。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;">页头包含事务信息,指针信息。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span style="font-family:宋体;background:yellow;">把页信息映射到内存的</span><span lang="EN-US" style="background:yellow;">buffer</span><span style="font-family:宋体;background:yellow;">中</span><span style="font-family:宋体;">。一个</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">包含前后指针的信息,能够通过后一个指针去找下一个</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">。所以我们就可以根据链表结构把</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">串起来。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span lang="EN-US">innodb</span><span style="font-family:宋体;">是双向链表(即</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">前后都有指针),把</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">串起来。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US">buffer</span><span style="font-family:宋体;">有三种状态:</span>
</p>
<p class="MsoListParagraph" style="margin-left:39.0pt;text-indent:-18.0pt;">
<span lang="EN-US">a、<span style="font:7.0pt ""> </span></span><span lang="EN-US">free</span><span style="font-family:宋体;">,从来没有被用过的</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">;</span>
</p>
<p class="MsoListParagraph" style="margin-left:39.0pt;text-indent:-18.0pt;">
<span lang="EN-US">b、<span style="font:7.0pt ""> </span></span><span lang="EN-US">clean</span><span style="font-family:宋体;">,干净的,磁盘上的数据和内存</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">中的数据是完全一样的</span><span lang="EN-US">;</span>
</p>
<p class="MsoListParagraph" style="margin-left:39.0pt;text-indent:-18.0pt;">
<span lang="EN-US">c、<span style="font:7.0pt ""> </span></span><span lang="EN-US">dirty</span><span style="font-family:宋体;">,内存</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">中的数据和磁盘数据不一致,即内存</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">中的数据还没来得及刷到磁盘中。</span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal" style="text-indent:21.0pt;">
<span lang="EN-US">mysql</span><span style="font-family:宋体;">的零碎知识点太多了,但是入门简单。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span><span style="font-family:宋体;">当然,链也有三种状态:</span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:-18.0pt;">
<span lang="EN-US">a、<span style="font:7.0pt ""> </span></span><span lang="EN-US">free list</span><span style="font-family:宋体;">(针对</span><span lang="EN-US">free buffer</span><span style="font-family:宋体;">来说)</span><span lang="EN-US">,</span><span style="font-family:宋体;">这种链会把从来没有使用过的</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">给串起来(不过,对于生产中跑起来的数据库,基本不存在</span><span lang="EN-US">free list</span><span style="font-family:宋体;">了);</span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:-18.0pt;">
<span lang="EN-US">b、<span style="font:7.0pt ""> </span></span><span lang="EN-US">lru list(</span><span style="font-family:宋体;">针对</span><span lang="EN-US">clean buffer</span><span style="font-family:宋体;">来说的</span><span lang="EN-US">)</span><span style="font-family:宋体;">,该链是用来串和磁盘数据一样的</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">。在</span><span lang="EN-US">lru
list</span><span style="font-family:宋体;">会把最近最少使用的放在</span><span lang="EN-US">lru</span><span style="font-family:宋体;">链表中。我们知道,有的数据经常被访问,有的数据是很少被访问。那么,对于很少被访问的</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">可以被新进来的</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">数据覆盖掉。所以,可以用</span><span lang="EN-US">lru list</span><span style="font-family:宋体;">把</span><span lang="EN-US">clean buffer</span><span style="font-family:宋体;">串起来。在</span><span lang="EN-US">lru list</span><span style="font-family:宋体;">上的是</span><span lang="EN-US">clean buffer</span><span style="font-family:宋体;">,这些</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">可以被新</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">数据覆盖,以循环使用内存空间。</span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:-18.0pt;">
<span lang="EN-US">c、<span style="font:7.0pt ""> </span></span><span lang="EN-US">flush list (</span><span style="font-family:宋体;">针对</span><span lang="EN-US">dirty buffer</span><span style="font-family:宋体;">来说的</span><span lang="EN-US">)</span><span style="font-family:宋体;">,</span> <span lang="EN-US">flush
list</span><span style="font-family:宋体;">上放的是脏块,用来告诉哪些</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">该刷新到磁盘上了。</span><span lang="EN-US">write thread</span><span style="font-family:宋体;">会到</span><span lang="EN-US">flush list</span><span style="font-family:宋体;">上去找哪些</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">该刷到磁盘上了。</span><span lang="EN-US">flush list</span><span style="font-family:宋体;">也分为最近最少被脏的。数据库会把最近最少使用的脏数据挂到</span><span lang="EN-US">flush
list</span><span style="font-family:宋体;">上,等数据库不繁忙的时候,</span><span lang="EN-US">write
thread</span><span style="font-family:宋体;">就会把</span><span lang="EN-US">flush list</span><span style="font-family:宋体;">上的脏块写到磁盘上。</span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"> </span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span style="font-family:宋体;">以上是三种</span><span lang="EN-US">buffer</span><span style="font-family:宋体;">状态和三种链表状态。</span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"> </span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US">innodb</span><span style="font-family:宋体;">三大特性也在内存池中。</span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span style="font-family:宋体;">不要小看</span><span lang="EN-US">mysql</span><span style="font-family:宋体;">数据库。</span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"><img width="554" height="304" id="图片 6" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_144284332489SW.jpg" /></span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"> </span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"><img width="553" height="347" id="图片 7" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_1442843324l8GG.jpg" /></span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"> </span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US">mysql</span><span style="font-family:宋体;">是单进程多线程的数据库。</span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"><img width="554" height="358" id="图片 8" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_1442843326Evpd.jpg" /></span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"> </span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"> </span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"><img width="554" height="396" id="图片 9" src="http://img.blog.itpub.net/blog/attachment/201509/21/28916011_1442843327J2ZX.jpg" /></span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span lang="EN-US"> </span>
</p>
<p class="MsoListParagraph" style="margin-left:23.25pt;text-indent:0cm;">
<span style="font-family:宋体;">段、区、页(</span><span lang="EN-US">oracle</span><span style="font-family:宋体;">是块)。</span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
<p class="MsoNormal">
<span lang="EN-US"> </span>
</p>
</div>
<br />
<br />
<div>
<a title="来自为知笔记(Wiz)" href="http://www.wiz.cn/i/5825ea21">来自为知笔记(Wiz)</a>
</div>
<br />
<br />
<div>
<h3>
附件列表
</h3>
<ul>
</ul>
</div>
<p>
</p>
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30345407/viewspace-2088065/
,如需转载,请注明出处,否则将追究法律责任。