??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧洲视频在线,91久久久久,日本亚洲不卡http://www.aygfsteel.com/zzzlyr/category/55295.htmlzh-cnThu, 25 Jan 2018 06:05:24 GMTThu, 25 Jan 2018 06:05:24 GMT60btree/b+treel构原理和应?/title><link>http://www.aygfsteel.com/zzzlyr/archive/2018/01/25/433028.html</link><dc:creator>张钊?/dc:creator><author>张钊?/author><pubDate>Thu, 25 Jan 2018 05:44:00 GMT</pubDate><guid>http://www.aygfsteel.com/zzzlyr/archive/2018/01/25/433028.html</guid><wfw:comment>http://www.aygfsteel.com/zzzlyr/comments/433028.html</wfw:comment><comments>http://www.aygfsteel.com/zzzlyr/archive/2018/01/25/433028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zzzlyr/comments/commentRss/433028.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zzzlyr/services/trackbacks/433028.html</trackback:ping><description><![CDATA[最q在公司有点旉所以深入研I了下数据库索引btree/b+tree数据l构和原理,由此牵引Z好多问题Q请看如下带着问题研究?br /><br />1Qؓ什?btree/b+tree 数据l构适合数据库烦引,它到底是怎么样一个原理和l构Q?br /><br />btree/b+tree 数据l构Q?br /><br /><span style="color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">在之前的文章中我们介l过AVL树,U黑树,它们都属于二叉树Q即每个节点最多只能拥?个子节点Q而B-treeQB树)的每个节点可以拥?个以上的子节点,所以我们简单概括一下:B-tree是一颗多路^衡查找树Q它q泛应用于数据库索引和文件系l中?/span><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">首先我们介绍一下一?m 阶B-tree的特性,那么q个 m 阶是怎么定义的呢Q这里我们以一个节点能拥有的最大子节点数来表示q颗树的阶数。D个例子,如果一个节Ҏ多有 n 个keyQ那么这个节Ҏ多就会有 n+1 个子节点Q这|叫?n+1Qm=n+1Q阶树。一?m 阶B-tree包括以下5条特性:</p><ol style="box-sizing: inherit; margin: 20px 0px; padding: 0px 0px 0px 40px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><li style="box-sizing: inherit; list-style-type: decimal; margin-top: 10px; list-style-position: outside;">每个节点最多有 m 个子节点</li><li style="box-sizing: inherit; list-style-type: decimal; margin-top: 10px; list-style-position: outside;">除根节点和叶子节点,其它每个节点臛_?[m/2] Q向上取整的意思)个子节点</li><li style="box-sizing: inherit; list-style-type: decimal; margin-top: 10px; list-style-position: outside;">若根节点不是叶子节点Q则其至有2个子节点</li><li style="box-sizing: inherit; list-style-type: decimal; margin-top: 10px; list-style-position: outside;">所有NULL节点到根节点的高度都一?/li><li style="box-sizing: inherit; list-style-type: decimal; margin-top: 10px; list-style-position: outside;">除根节点外,其它节点都包?n 个keyQ其?[m/2] -1 <= n <= m-1</li></ol><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">q些Ҏ可能看着不太好理解,下面我们会介lB-tree的插入,在插入节点的q程中我们就会慢慢理解这些特性了。B-tree的插入比较简单,是一个节点至下而上的分裂过E。下面我们具体以一?阶树来展CB-tree的插入过E?/p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">首先我们 插入 200Q?00Q?00Q没有什么问题,直接插入好?/p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">| 200 | 300 | 400 |<br style="box-sizing: inherit;" /></p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">现在我们接着插入500Q这个时候我们发现有炚w题,Ҏ定义及特?我们知道一?阶B-tree的每个节Ҏ多只能有3个keyQ插?00后这个节点就?个key了?/p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">| 200 | 300 | 400 | 500 |<br style="box-sizing: inherit;" /></p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">q个时候我们就需要分裂,中间的key上移到父节点Q左边的作ؓ左节点,双的作为右节点Q如下图所C:</p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"></p><figure style="box-sizing: inherit; margin: 24px 0px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><img src="https://pic4.zhimg.com/80/v2-d44a37240c1d4226d82480e87321e0a9_hd.jpg" data-rawwidth="428" data-rawheight="172" zh-lightbox-thumb="" lazy"="" width="428" data-original="https://pic4.zhimg.com/v2-d44a37240c1d4226d82480e87321e0a9_r.jpg" data-actualsrc="https://pic4.zhimg.com/v2-d44a37240c1d4226d82480e87321e0a9_b.jpg" style="box-sizing: inherit; overflow: hidden; display: block; max-width: 100%; margin: 0px auto; cursor: -webkit-zoom-in;" alt="" /></figure><span style="color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">q个时候我们是不是明白特?了,如果根节点不是叶子节点,那么它肯定发生了分裂Q所以至会?个子节点。同h们接着插入600Q?00Q?00Q?00插入q程如下图所C:</span><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"></p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"></p><figure style="box-sizing: inherit; margin: 24px 0px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><img src="https://pic2.zhimg.com/80/v2-4fc1d75f4904af871324b8dd2399e499_hd.jpg" data-rawwidth="834" data-rawheight="810" zh-lightbox-thumb="" lazy"="" width="834" data-original="https://pic2.zhimg.com/v2-4fc1d75f4904af871324b8dd2399e499_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-4fc1d75f4904af871324b8dd2399e499_b.jpg" style="box-sizing: inherit; overflow: hidden; display: block; max-width: 100%; margin: 0px auto; cursor: -webkit-zoom-in;" alt="" /></figure><span style="color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">现在根节点也已经满了Q如果我们l插?10Q?20Q会怎样呢?根节点就会l分裂,树l向上生ѝ看下图Q?/span><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"></p><figure style="box-sizing: inherit; margin: 24px 0px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><img src="https://pic1.zhimg.com/80/v2-19c2afb9282e50971e44d6dca939f8f8_hd.jpg" data-rawwidth="736" data-rawheight="674" zh-lightbox-thumb="" lazy"="" width="736" data-original="https://pic1.zhimg.com/v2-19c2afb9282e50971e44d6dca939f8f8_r.jpg" data-actualsrc="https://pic1.zhimg.com/v2-19c2afb9282e50971e44d6dca939f8f8_b.jpg" style="box-sizing: inherit; overflow: hidden; display: block; max-width: 100%; margin: 0px auto; cursor: -webkit-zoom-in;" alt="" /></figure><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">通过整个的插入过E我们也会发玎ͼB-tree和二叉树的一个显著的区别是QB-tree是从下往上生长,而二叉树是从上往下生长的。现在我们想想特?和特?是ؓ什么?首先我们知道子节点的个数是等于key的数?1Q然后一个节点达到m个key后就会分裂,所以分裂后的节Ҏ能得到 m/2 - 1个key 。ؓ啥还要减一呢?因ؓq要拿一个作为父节点。所以这个节Ҏ回拥有 m/2 - 1 + 1 = m/2 个子节点。同样得到特?Q因为最有m/2个子节点Q所以最就含有m/2-1个keyQm 阶树Q每个节点存Cm个key׃分裂Q所以最多就?m-1个key?/p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">Ҏ以上Ҏ我们能推出一含有N个d键字数的m阶的B-tree树的最大高度h的?</p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><span style="box-sizing: inherit; font-weight: 600;">树的高度h: 1Q?2Q?3 Q?4 Q?......... Q?h</span></p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><span style="box-sizing: inherit; font-weight: 600;">节点个数s: 1Q?2Q?2*(m/2)Q?2*(m/2)(m/2)Q?........ Q?*(m/2)的h-2ơ方</span></p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><span style="box-sizing: inherit; font-weight: 600;">s = 1 + 2(1 - <img src="http://www.zhihu.com/equation?tex=%28m%2F2%29%5E%7Bh-1%7D+" alt="(m/2)^{h-1} " eeimg="1" style="box-sizing: inherit; overflow: hidden; display: inline-block; max-width: 100%; margin: 0px 3px; vertical-align: middle;" />)/(1- (m/2))</span></p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><span style="box-sizing: inherit; font-weight: 600;">N = 1 + s * ((m/2) - 1) = 2 * (<img src="http://www.zhihu.com/equation?tex=%28m%2F2%29%5E%7Bh-1%7D+" alt="(m/2)^{h-1} " eeimg="1" style="box-sizing: inherit; overflow: hidden; display: inline-block; max-width: 100%; margin: 0px 3px; vertical-align: middle;" />) - 1</span></p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><span style="box-sizing: inherit; font-weight: 600;">h = log┌m/2┐((N+1)/2 )+1</span></p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;">2Qؓ什么btree/b+tree 为常用数据库索引l构Q?br /></p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">上文说过Q红黑树{数据结构也可以用来实现索引Q但是文件系l及数据库系l普遍采用B-/+Tree作ؓ索引l构Q这一节将l合计算机组成原理相关知识讨论B-/+Tree作ؓ索引的理论基?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">一般来_索引本n也很大,不可能全部存储在内存中,因此索引往往以烦引文件的形式存储的磁盘上。这L话,索引查找q程中就要生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量Q所以评价一个数据结构作为烦引的优劣最重要的指标就是在查找q程中磁盘I/O操作ơ数的渐q复杂度。换句话_索引的结构组l要量减少查找q程中磁盘I/O的存取次数。下面先介绍内存和磁盘存取原理,然后再结合这些原理分析B-/+Tree作ؓ索引的效率?/p><h3><a name="t8" style="box-sizing: border-box; background: transparent; color: rgb(66, 139, 202); margin: 0px; padding: 0px; outline: 0px;"></a>d存取原理</h3><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">目前计算Z用的d基本都是随机d存储器(RAMQ,CRAM的结构和存取原理比较复杂Q这里本文抛却具体差别,抽象Z个十分简单的存取模型来说明RAM的工作原理?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;"><a target="_blank" style="box-sizing: border-box; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; color: #ca0c16; text-decoration-line: none; margin: 0px; padding: 0px; outline: 0px;"></a></p><p align="center" style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;"><strong style="box-sizing: border-box;">?</strong></p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">从抽象角度看Q主存是一pd的存储单元组成的矩阵Q每个存储单元存储固定大的数据。每个存储单元有唯一的地址Q现代主存的~址规则比较复杂Q这里将其简化成一个二l地址Q通过一个行地址和一个列地址可以唯一定位C个存储单元。图5展示了一? x 4的主存模型?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">d的存取过E如下:</p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">当系l需要读取主存时Q则地址信号攑ֈ地址ȝ上传l主存,dd地址信号后,解析信号q定位到指定存储单元Q然后将此存储单元数据放到数据ȝ上,供其它部件读取?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">写主存的q程cMQ系l将要写入单元地址和数据分别放在地址ȝ和数据ȝ上,dd两个ȝ的内容,做相应的写操作?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">q里可以看出Q主存存取的旉仅与存取ơ数呈线性关p,因ؓ不存在机械操作,两次存取的数据的“距离”不会Ҏ间有M影响Q例如,先取A0再取A1和先取A0再取D3的时间消耗是一L?/p><h3><a name="t9" style="box-sizing: border-box; background: transparent; color: rgb(66, 139, 202); margin: 0px; padding: 0px; outline: 0px;"></a>盘存取原理</h3><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">上文说过Q烦引一般以文g形式存储在磁盘上Q烦引检索需要磁盘I/O操作。与d不同Q磁盘I/O存在机械q动耗费Q因此磁盘I/O的时间消耗是巨大的?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">?是磁盘的整体l构C意图?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;"></p><p align="center" style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;"><strong style="box-sizing: border-box;">?</strong></p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">一个磁盘由大小相同且同轴的圆Ş盘片l成Q磁盘可以{动(各个盘必须同步转动Q。在盘的一侧有头支架Q磁头支架固定了一l磁_每个头负责存取一个磁盘的内容。磁头不能{动,但是可以沿磁盘半径方向运动(实际是斜切向q动Q,每个头同一时刻也必L同u的,即从正上方向下看Q所有磁头Q何时候都是重叠的Q不q目前已l有多磁头独立技术,可不受此限制Q?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">?是磁盘结构的C意图?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;"></p><p align="center" style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;"><strong style="box-sizing: border-box;">?</strong></p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">盘片被划分成一pd同心环,圆心是盘片中心,每个同心环叫做一个磁道,所有半径相同的道l成一个柱面。磁道被沿半径线划分成一个个的D,每个D叫做一个扇区,每个扇区是磁盘的最存储单元。ؓ了简单v见,我们下面假设盘只有一个盘片和一个磁头?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">当需要从盘d数据Ӟpȝ会将数据逻辑地址传给盘Q磁盘的控制电\按照d逻辑逻辑地址译成物理地址Q即定要读的数据在哪个道Q哪个扇区。ؓ了读取这个扇区的数据Q需要将头攑ֈq个扇区上方Qؓ了实现这一点,头需要移动对准相应磁道,q个q程叫做寻道Q所耗费旉叫做寻道旉Q然后磁盘旋转将目标扇区旋{到磁头下Q这个过E耗费的时间叫做旋转时间?/p><h3><a name="t10" style="box-sizing: border-box; background: transparent; color: rgb(66, 139, 202); margin: 0px; padding: 0px; outline: 0px;"></a>局部性原理与盘预读</h3><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">׃存储介质的特性,盘本n存取比d慢很多,再加上机械运动耗费Q磁盘的存取速度往往是主存的几百分分之一Q因此ؓ了提高效率,要尽量减磁盘I/O。ؓ了达到这个目的,盘往往不是严格按需dQ而是每次都会预读Q即使只需要一个字节,盘也会从这个位|开始,序向后d一定长度的数据攑օ内存。这样做的理Z据是计算机科学中著名的局部性原理:</p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">当一个数据被用到Ӟ光q的数据也通常会马上被使用?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">E序q行期间所需要的数据通常比较集中?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">׃盘序d的效率很高(不需要寻道时_只需很少的旋转时_Q因此对于具有局部性的E序来说Q预d以提高I/O效率?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">预读的长度一般ؓ(pageQ的整倍数。页是计机理存储器的逻辑块,g及操作系l往往主存和盘存储区分割ؓq箋的大相{的块,每个存储块称Z(在许多操作系l中Q页得大通常?kQ,d和磁盘以ؓ单位交换数据。当E序要读取的数据不在d中时Q会触发一个缺异常,此时pȝ会向盘发出ȝ信号Q磁盘会扑ֈ数据的v始位|ƈ向后q箋d一|几页载入内存中,然后异常q回Q程序l运行?/p><h3><a name="t11" style="box-sizing: border-box; background: transparent; color: rgb(66, 139, 202); margin: 0px; padding: 0px; outline: 0px;"></a>B-/+Tree索引的性能分析</h3><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">到这里终于可以分析B-/+Tree索引的性能了?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">上文说过一般用磁盘I/Oơ数评h索引l构的优劣。先从B-Tree分析Q根据B-Tree的定义,可知索一ơ最多需要访问h个节炏V数据库pȝ的设计者y妙利用了盘预读原理Q将一个节点的大小设ؓ{于一个页Q这h个节点只需要一ơI/O可以完全蝲入。ؓ了达到这个目的,在实际实现B- Treeq需要用如下技巧:</p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">每次新徏节点Ӟ直接甌一个页的空_q样׃证一个节点物理上也存储在一个页里,加之计算机存储分配都是按对齐的Q就实现了一个node只需一ơI/O?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;"><strong style="box-sizing: border-box;">B-Tree中一ơ检索最多需要h-1ơI/OQ根节点帔R内存Q,渐进复杂度ؓO(h)=O(log<span style="box-sizing: border-box; position: relative; font-size: 12px; line-height: 0; vertical-align: baseline; bottom: -0.25em;">d</span>N)?/strong>一般实际应用中Q出度d是非常大的数字,通常过100Q因此h非常(通常不超q?Q?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">lg所qͼ用B-Tree作ؓ索引l构效率是非帔R的?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">而红黑树q种l构Qh明显要深的多。由于逻辑上很q的节点Q父子)物理上可能很q,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h)Q效率明显比B-Tree差很多?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">上文q说q,B+Tree更适合外存索引Q原因和内节点出度d有关。从上面分析可以看到Qd大索引的性能好Q而出度的上限取决于节点内key和data的大:</p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">d<span style="box-sizing: border-box; position: relative; font-size: 12px; line-height: 0; vertical-align: baseline; bottom: -0.25em;">max</span> = <span style="box-sizing: border-box;"><strong style="box-sizing: border-box;">floor</strong></span>(pagesize / (keysize + datasize + pointsize))  <span style="box-sizing: border-box;"><span style="box-sizing: border-box; margin: 0px; padding: 0px; color: #a5a5a5;">(pagesize – dmax >= pointsize)</span></span></p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">d<span style="box-sizing: border-box; position: relative; font-size: 12px; line-height: 0; vertical-align: baseline; bottom: -0.25em;">max</span> = <span style="box-sizing: border-box;"><strong style="box-sizing: border-box;">floor</strong></span>(pagesize / (keysize + datasize + pointsize)) - 1  <span style="box-sizing: border-box;"><span style="box-sizing: border-box; margin: 0px; padding: 0px; color: #a5a5a5;">(pagesize – dmax < pointsize)</span></span></p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">floor表示向下取整。由于B+Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能?/p><p style="box-sizing: border-box; margin: 0px; padding: 0px; color: #454545; font-family: "PingFang SC", "Microsoft YaHei", SimHei, Arial, SimSun; font-size: 16px;">q一章从理论角度讨论了与索引相关的数据结构与法问题Q下一章将讨论B+Tree是如何具体实CؓMySQL中烦引,同时结合MyISAM和InnDB存储引擎介绍非聚集烦引和聚集索引两种不同的烦引实现Ş式?/p><p style="box-sizing: inherit; margin: 0px 0px 20px; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", "WenQuanYi Micro Hei", sans-serif; font-size: medium;"><br /><br /></p><img src ="http://www.aygfsteel.com/zzzlyr/aggbug/433028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zzzlyr/" target="_blank">张钊?/a> 2018-01-25 13:44 <a href="http://www.aygfsteel.com/zzzlyr/archive/2018/01/25/433028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯɽ</a>| <a href="http://" target="_blank">غ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͷ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">찲</a>| <a href="http://" target="_blank">ʩ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ų</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̶</a>| <a href="http://" target="_blank">뵺</a>| <a href="http://" target="_blank">䰲</a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>